【问题标题】:How do I wake up a thread from a pool of threads waiting on condition variable/semaphore?如何从等待条件变量/信号量的线程池中唤醒线程?
【发布时间】:2016-05-17 10:45:21
【问题描述】:

情况:

  1. 线程 A 调用 wait(&sem); // 成功
  2. 线程 B 调用 wait(&sem); // 块
  3. 线程 C 调用 wait(&sem); // 块
  4. 线程 A 调用 signal(&sem);

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

这是随机的吧?

但是,我总是希望线程 B 在线程 C 之前唤醒,因为 B 在 C 之前调用了等待。是否存在使用同步来做到这一点的现有机制。机械。?如果需要,请明确提及使用任何其他数据结构!

【问题讨论】:

  • 您发布的示例中没有一个,因为 Thread A calls wait(&sem); 意味着 Thread A calls signal(&sem); 是从未达到。如果将 Thread A calls signal(&sem); 替换为 Thread D calls signal(&sem);,线程 A、B 或 C 中的任何一个都将被唤醒,并且在一般情况下,您根本无法控制哪一个。
  • 初始条件:sem被初始化为1,线程A是第一个成功获取信号量的线程。那为什么signal(&sem) 达不到呢?
  • 它将是,给定您更改的初始条件。
  • 让这些考虑无关紧要是软件设计的一部分。如果您不在乎哪个线程被唤醒,那么您不会失望。
  • 如果你关心唤醒哪个线程,那么你就唤醒那个线程。

标签: c multithreading operating-system synchronization semaphore


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2017-11-09
    相关资源
    最近更新 更多