首页 > 解决方案 > 如何判断线程 A 的所有实例何时从线程 B 完成

问题描述

我目前正在用 C++ 编写一个程序,该程序使用线程模拟餐厅中的服务员和顾客。该程序运行 40 个客户线程和 3 个服务员线程,功能如下:

void *customer(void * vargp){
    //depending on assigned table, call waiter 1-3 using semaphore
    sem_post(&callWaiter);
    //wait for waiter to respond
    sem_wait(&waiterResponse);
    //leave table and finish thread
}

void *waiter(void *vargp){
    //this is what I'm trying to fix
    while(there are still customers){ //this check has been a number of different attempts
        sem_wait(&callWaiter);
        sem_post(&waiterResponse);
    }
}

我试图找到解决方案的问题是服务员会看到客户仍然活跃(通过我尝试的几种不同技术),然后阻止等待信号量,然后客户将完成并且不会再有顾客。有没有人知道服务员线程如何在最后一个客户完成之前检查正在运行的客户而不通过检查?

标签: c++multithreadingconcurrency

解决方案


您正在寻找的是条件变量。它们在 pthreads 中,现在是 C++11 线程库的一部分。它们是专门为解决您遇到的问题而构建的,因为您遇到的问题通常无法通过互斥锁和 seamphores 解决。

但是,您需要的特定版本可能是可以解决的。我不知道你的特别作业问题是什么,但它可能非常类似于睡眠理发师问题,它有几种已知的解决方案,其中至少一个可以在上面的维基百科链接中找到。


推荐阅读