一个线程如何创建而不是等待条件变量

时间:2017-04-18 13:03:24

标签: c++ multithreading mutex 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。 我是多线程的新手,如果出现问题,编辑我的问题会很好。

1 个答案:

答案 0 :(得分:0)

问题是我已经知道我可以在简单的if中使用cv。使用cv的主要原因是我们可以在不阻塞其他线程的情况下阻止我们的线程(它在解锁互斥锁的同时等待cv)。我们只需要发信号通知已完成条件,我们已准备好解除阻塞(释放)线程并创建我们想要的功能。我正在使用pthread_cond_timedwait() 因为我可以在我想要的时间内阻止我的线程。