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

时间:2016-05-17 10:45:22

标签: c multithreading operating-system synchronization semaphore

情况:

  1. 主题A调用等待& sem ); //成功
  2. 主题B调用等待& sem ); // blocks
  3. 主题C调用等待& sem ); // blocks
  4. 主题A调用信号& sem );
  5. 现在是什么??? 哪个线程被唤醒了?

    这是随机的吗?

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

1 个答案:

答案 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)
}