一个线程如何做某事而不是等待条件变量

How one thread make something instead of waiting on condition variable

在问这个问题之前我一直在搜索,但我找不到解决问题的方法。 我有五个线程(工人),这些工人正在开采黄金,将黄金运送到前哨并在那里卸货。

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

当工人开采黄金时,有 2 秒的睡眠时间,这就是我使用 pthread_cond_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);
}

我正在尝试制作类似消费者生产者的东西,但在我的任务中我需要做一些事情(开采黄金)而不是等待其他线程来开采。

另一个问题是我需要在这两个函数中使用相同的互斥量吗?

P.S。 我是多线程方面的新手,如果有什么问题,最好有人来编辑我的问题。

问题是我知道我可以简单地使用 cv if.The 使用 cv 的主要原因是我们可以阻塞我们的线程而不阻塞其他线程(它在等待时解锁互斥锁cv).我们只需要发出条件已完成的信号,我们就可以解除阻塞(释放)线程并执行我们想要的功能。我正在使用 pthread_cond_timedwait() 因为我可以在我想要的时间阻塞我的线程。