【问题标题】:How one thread make something instead of waiting on condition variable一个线程如何做某事而不是等待条件变量
【发布时间】:2017-04-18 13:03:23
【问题描述】:

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

我的问题是,当工人挖金子时,用户可以输入 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);
}

我试图做一些像消费者生产者一样的东西,但在我的任务中我需要做一些事情(挖掘黄金)而不是等待其他线程来挖掘。

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

附: 我是多线程的新手,如果有什么问题,最好有人编辑我的问题。

【问题讨论】:

  • 不使用线程做这种模拟比较容易;您想使用线程有什么特别的原因吗?每次循环(增量时间)时,标准(单线程)游戏循环更新进度将是我处理此任务的方式。
  • 是的,我知道,但我的任务是让我学习如何使用线程、互斥锁和条件变量。我知道如何在没有线程的情况下实现它。
  • 为什么不使用线程池并完成它?
  • 您有wantBarrack 的竞争条件。您需要同步对该标志的访问。
  • 如果你还没有锁定mutex,你不能打电话给pthread_cond_wait(mutex)

标签: c++ multithreading mutex condition-variable


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多