C++ 一个线程如何生成某些内容而不是等待条件变量

C++ 一个线程如何生成某些内容而不是等待条件变量,c++,multithreading,mutex,condition-variable,C++,Multithreading,Mutex,Condition Variable,在问这个问题之前,我一直在寻找,但我找不到如何解决我的问题。 我有五根线(工人),这些工人在开采黄金,把黄金运到先锋驿站,然后在那里卸货 我的问题是,当工人在开采黄金时,用户可以输入b来检查是否有足够的黄金,如果这是真的,就可以建造兵营 当工人在开采黄金时,有2秒的睡眠时间,这就是为什么我使用pthread\u cond\u timedwait()。 我有全局变量,存储兵营编号、地图上的黄金和前卫邮政中的黄金 这是伪代码 void makeBarrack(size_t data) { t

在问这个问题之前,我一直在寻找,但我找不到如何解决我的问题。 我有五根线(工人),这些工人在开采黄金,把黄金运到先锋驿站,然后在那里卸货

我的问题是,当工人在开采黄金时,用户可以输入b来检查是否有足够的黄金,如果这是真的,就可以建造兵营

当工人在开采黄金时,有2秒的睡眠时间,这就是为什么我使用
pthread\u cond\u timedwait()
。 我有全局变量,存储兵营编号、地图上的黄金和前卫邮政中的黄金 这是伪代码

void makeBarrack(size_t data) {
    timespec waitTime = { 2, 0 };
    pthread_mutex_lock(&check_mutex);
    while (wantBarrack) {
        pthread_cond_timedwait(&condp, &gold_mutex, &waitTime);
    }
    std::cout << "Worker" << data << "is making barrack" << std::endl;
    wantBarrack = false;
    pthread_mutex_lock(&unload_mutex);
    avantPost -= 100;
    pthread_mutex_unlock(&unload_mutex);
    barracks++;

    pthread_mutex_unlock(&check_mutex);
}

void *work(void *data, char input) {

    size_t thread_num = (size_t) data;
    pthread_mutex_lock(&gold_mutex);
    timespec waitTime = { 2, 0 };
    if ((input == 'B' || input == 'b') && avantPost >= 100) {
        wantBarrack = true;
        input = 0;
    } else if ((input == 'B' || input == 'b') && avantPoste < 100) {
        std::cout << "There is " << avantPoste << " gold" << std::endl;
    }
    while (wantBarrack) {
        pthread_cond_timedwait(&condp, &gold_mutex, &waitTime);
    }
    makeBarrack(data);
}
void makeBarrack(大小数据){
timespecwaittime={2,0};
pthread_mutex_lock(&check_mutex);
while(wantBarrack){
pthread_cond_timedwait(&condp、&gold_mutex和&waitTime);
}

std::cout问题是,我已经学会了在简单if中使用cv。使用cv的主要原因是我们可以在不阻塞其他线程的情况下阻塞我们的线程(它在等待cv时解锁互斥)。我们只需要发出信号,表明条件已经完成,我们准备解除阻塞(释放)我正在使用
pthread\u cond\u timedwait()

因为我可以在我想要的时间内阻止我的线程。

问题是,我已经了解到我可以在简单的if中使用cv。使用cv的主要原因是,我们可以阻止我们的线程而不阻止其他线程(它在等待cv时解锁互斥锁)。我们只需要发出信号,表明条件已经完成,我们已经准备好解除阻止(释放)线程并生成我们想要的函数。我正在使用
pthread\u cond\u timedwait()

因为我可以在我想要的时间内阻止我的线程。

不使用线程进行这种类型的模拟更容易;您想使用线程有什么特殊原因吗?标准(单线程)游戏循环每次循环更新进度(增量时间)这将是我完成此任务的方式。是的,我知道,但我的任务是学习如何使用线程、互斥和条件变量。我知道如何在没有线程的情况下使用线程池。为什么不使用线程池并完成它?您对
wantBarrack
有一个竞争条件。您需要同步访问该标志。您不能调用
pthread_cond_wait(mutex)
如果您尚未锁定
mutex
。不使用线程进行此类模拟会更容易;是否有特定的原因需要使用线程?标准(单线程)游戏循环每次循环更新进度(增量时间)这将是我完成此任务的方式。是的,我知道,但我的任务是学习如何使用线程、互斥和条件变量。我知道如何在没有线程的情况下使用线程池。为什么不使用线程池并完成它?您对
wantBarrack
有一个竞争条件。您需要同步访问该标志。您不能调用
pthread_cond_wait(互斥锁)
如果您尚未锁定互斥锁