gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:02:53 25 4
gpt4 key购买 nike

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

我的问题是,当 worker 正在开采金子时,用户可以输入 b 来检查是否有足够的金子,如果是这样就可以 build 营房。

当 worker 正在开采黄金时,有 2 秒的 sleep 时间,这就是我使用 pthread_cond_timedwait() 的原因。我有全局变量,用于存储兵营编号、 map 上的黄金和前卫邮政中的黄金这是伪代码。

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);
}

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

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

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

最佳答案

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

关于c++ - 一个线程如何做某事而不是等待条件变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43473005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com