一旦我们发出了一个条件变量的信号,我们会继续执行原始线程吗?

时间:2015-03-02 06:10:41

标签: c pthreads mutex race-condition

我有一个问题。

Process A                             Process B
int A = 0;                            int B = 0;
pthread_mutex_lock(&mutex);
while (condition == FALSE)
  pthread_cond_wait(&cond, &mutex);
                                    pthread_mutex_lock(&mutex);
                                    condition = TRUE;
                                    pthread_cond_signal(&cond);
                                    pthread_mutex_unlock((&mutex)
   A += 10;                         B += 10;

我的问题是,如果进程B有其他指令,例如:int B + = 10;,

B会立即执行B + = 10,否则A会控制?

是,过程B是继续执行还是A将被唤醒&掌控?

例如,B + = 10先于A + = 10还是反之亦然?

3 个答案:

答案 0 :(得分:1)

每个条件变量都与互斥锁相关联。调用pthread_cond_wait时必须保留互斥锁; pthread_cond_wait释放互斥锁,等待发出信号的条件,然后在返回之前重新获取互斥文件。

您可以使用互斥锁或释放互斥锁后调用pthread_cond_signal。如果在保持互斥锁的情况下调用它,则在释放互斥锁之前不能继续pthread_cond_wait

问题中的示例代码在执行B += 10; [注1]之前不会释放互斥锁,因此肯定会在A += 10;之前执行。当然,必须在某个时候释放互斥锁。

释放互斥锁后,两个线程都以未指定的顺序执行。如果您的计算机有多个核心(这些天很常见),它们可能同时执行。


注意:

  1. int B += 10;无效。你不能声明一个变量并在一个语句中增加它(变量在哪里初始化?)

答案 1 :(得分:0)

这是一种未定义的行为。由于您没有同步访问权限,因此无法确定哪一个是第一个。虽然在现实生活中它依赖于pthread_cond_signal的操作系统实现,但你不应该依赖它。

答案 2 :(得分:0)

您的代码不完整,因为进程B永远不会解锁互斥锁。

当进程A执行pthread_cond_wait时,它以原子方式解锁互斥锁并等待进程B的信号。当进程B调用pthread_cond_signal时,进程A将尝试再次锁定互斥锁。由于B永远不会解锁互斥锁,因此A会在尝试获取互斥锁时遇到困难。

因此,只会运行B += 10语句。当且仅当进程B解锁互斥锁时,A += 10才会运行。