我有一个问题。
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还是反之亦然?
答案 0 :(得分:1)
每个条件变量都与互斥锁相关联。调用pthread_cond_wait
时必须保留互斥锁; pthread_cond_wait
释放互斥锁,等待发出信号的条件,然后在返回之前重新获取互斥文件。
您可以使用互斥锁或释放互斥锁后调用pthread_cond_signal
。如果在保持互斥锁的情况下调用它,则在释放互斥锁之前不能继续pthread_cond_wait
。
问题中的示例代码在执行B += 10;
[注1]之前不会释放互斥锁,因此肯定会在A += 10;
之前执行。当然,必须在某个时候释放互斥锁。
释放互斥锁后,两个线程都以未指定的顺序执行。如果您的计算机有多个核心(这些天很常见),它们可能同时执行。
注意:
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
才会运行。