【发布时间】: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