-2
- 线程A调用等待(& SEM); //成功
- 线程B调用等待(& SEM); // blocks
- 线程C调用wait(& sem); // blocks
- Thread A calls signal(& sem);
现在呢? 哪个线程被唤醒?
这是随机的吗?
但是,我总是希望线程B在线程C之前被唤醒,因为B在C之前调用了wait。是否存在使用sync的现有机制。机甲?清楚地提及如果需要使用任何其他数据结构!
现在呢? 哪个线程被唤醒?
这是随机的吗?
但是,我总是希望线程B在线程C之前被唤醒,因为B在C之前调用了wait。是否存在使用sync的现有机制。机甲?清楚地提及如果需要使用任何其他数据结构!
其实我正在寻找这样的东西。 可以使用条件变量实现序列化线程执行。
Mutex M;
Condition Variable C = 1;
thread_function_A()
{
pthread_mutex_lock(M);
while (C != 1)
pthread_cond_wait(C, M);
CRITICAL SECTION STARTS;
CRITICAL SECTION ENDS;
C++;
pthread_mutex_unlock(M);
}
thread_function_B()
{
pthread_mutex_lock(M)
while (C != 2)
pthread_cond_wait(C, M);
CRITICAL SECTION STARTS
CRITICAL SECTION ENDS
C++;
pthread_mutex_unlock(M)
}
thread_function_C()
{
pthread_mutex_lock(M)
while (C != 3)
pthread_cond_wait(C, M);
CRITICAL SECTION STARTS
CRITICAL SECTION ENDS
C++;
pthread_mutex_unlock(M)
}
他们都不在您发布的例子,因为*线程A调用wait(&sem); *意味着*线程A调用信号(&sem); *从未达到。如果换成*线程A调用信号(&sem); *有*线程D调用信号(&sem); *,线程A,B或C中的任何一个都会唤醒,并且一般情况下,根本没有**的控制** –
初始条件:sem初始化为1,线程A是第一个成功获得信号量的机器,那么为什么信号(&sem)将不能被达到? –
这将是,根据你改变的初始条件 –