我在问这个问题之前很久都在寻找,但我无法找到解决问题的方法。 我有五个线程(工人),这个工人正在开采黄金,运输黄金到前卫并在那里卸载。
我的问题在于,当工人开采黄金时,用户可以输入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。 我是多线程的新手,如果出现问题,编辑我的问题会很好。
答案 0 :(得分:0)
问题是我已经知道我可以在简单的if中使用cv。使用cv的主要原因是我们可以在不阻塞其他线程的情况下阻止我们的线程(它在解锁互斥锁的同时等待cv)。我们只需要发信号通知已完成条件,我们已准备好解除阻塞(释放)线程并创建我们想要的功能。我正在使用pthread_cond_timedwait()
因为我可以在我想要的时间内阻止我的线程。