C语言中的线程同步

C语言中的线程同步,c,multithreading,C,Multithreading,我正试图做一个如下的项目: 我将有10个线程,每个线程控制一列10个矩形框(10列10个框),每3秒左右,我需要其中2个线程来改变颜色(即红色),这样在任何时候,10个红色框中应有2个红色列 框列的当前代码: void* thread_func_1() { while (1) { if (randomNo1 == 1 || randomNo2 == 1) { sema_wait(&sem) ;

我正试图做一个如下的项目: 我将有10个线程,每个线程控制一列10个矩形框(10列10个框),每3秒左右,我需要其中2个线程来改变颜色(即红色),这样在任何时候,10个红色框中应有2个红色列

框列的当前代码:

void* thread_func_1() {
      while (1) {
           if (randomNo1 == 1 || randomNo2 == 1) {
               sema_wait(&sem) ;
               drawRedBoxes();
               sleep(3000);
               drawBlueBoxes();
               sema_post(&sem);
               randomize(); // random 2 more numbers 
           }else{
               drawBlueBoxes();
          }      
}

void randomize(){
    do{
        randomNo1 = 1 + rand()/ (RAND_MAX/(10) + 1);
        randomNo2 = 1 + rand()/ (RAND_MAX/(10) + 1);
    } while (randomNo1 == randomNo2);
}
编辑:所有10个线程的代码都相似。Drawbox函数在列中绘制10个矩形框


不是确切的代码,但它是这样的。理想情况下,我希望两个新的红色列同时出现(或者至少在它们之间有很短的时间延迟),但我意识到,过了一段时间,很明显,一个红色列一个接一个出现。我怎样才能解决这个问题?

这个问题不是很清楚。如果信号量是在保护
draw*()
函数,那么为什么在
sleep()
期间保持信号量呢?我怀疑
屏障比
信号量更接近您需要的。您的问题太假设了。您是否有可以呈现的实际代码(以a的形式)?另外,您是在交替使用“brick”和“bar”这两个词,还是您的用法反映了您没有提到的其他行为要求?好吧,如果这是您的实际代码,您对
randomNo1
randomNo2
的非同步、非只读、非原子访问具有竞争条件。这是未定义的行为。此外,如果您的所有线程函数都是这样的(即它们都调用
randomize()
),那么即使对全局函数的访问进行了适当的同步,您的线程仍然无法获得一致的视图。这个问题不是很清楚。如果信号量是在保护
draw*()
函数,那么为什么在
sleep()
期间保持信号量呢?我怀疑
屏障比
信号量更接近您需要的。您的问题太假设了。您是否有可以呈现的实际代码(以a的形式)?另外,您是在交替使用“brick”和“bar”这两个词,还是您的用法反映了您没有提到的其他行为要求?好吧,如果这是您的实际代码,您对
randomNo1
randomNo2
的非同步、非只读、非原子访问具有竞争条件。这是未定义的行为。此外,如果您的所有线程函数都是这样的(即,它们都调用
randomize()
),那么即使正确同步全局函数的访问,您的线程仍然无法获得它们的一致视图。