2016-05-17 88 views
-2

现状:如何从等待条件变量/信号量的线程池中唤醒线程?

  1. 线程A调用等待& SEM); //成功
  2. 线程B调用等待& SEM); // blocks
  3. 线程C调用wait& sem); // blocks
  4. Thread A calls signal& sem);

现在呢? 哪个线程被唤醒?

这是随机的吗?

但是,我总是希望线程B在线程C之前被唤醒,因为B在C之前调用了wait。是否存在使用sync的现有机制。机甲?清楚地提及如果需要使用任何其他数据结构!

+2

他们都不在您发布的例子,因为*线程A调用wait(&sem); *意味着*线程A调用信号(&sem); *从未达到。如果换成*线程A调用信号(&sem); *有*线程D调用信号(&sem); *,线程A,B或C中的任何一个都会唤醒,并且一般情况下,根本没有**的控制** –

+0

初始条件:sem初始化为1,线程A是第一个成功获得信号量的机器,那么为什么信号(&sem)将不能被达到? –

+0

这将是,根据你改变的初始条件 –

回答

0

其实我正在寻找这样的东西。 可以使用条件变量实现序列化线程执行。

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) 
} 
相关问题