一个线程如何做某事而不是等待条件变量
How one thread make something instead of waiting on 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。
我是多线程方面的新手,如果有什么问题,最好有人来编辑我的问题。
问题是我知道我可以简单地使用 cv if.The 使用 cv 的主要原因是我们可以阻塞我们的线程而不阻塞其他线程(它在等待时解锁互斥锁cv).我们只需要发出条件已完成的信号,我们就可以解除阻塞(释放)线程并执行我们想要的功能。我正在使用 pthread_cond_timedwait()
因为我可以在我想要的时间阻塞我的线程。
在问这个问题之前我一直在搜索,但我找不到解决问题的方法。 我有五个线程(工人),这些工人正在开采黄金,将黄金运送到前哨并在那里卸货。
我的问题是,当工人在开采黄金时,用户可以输入 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。 我是多线程方面的新手,如果有什么问题,最好有人来编辑我的问题。
问题是我知道我可以简单地使用 cv if.The 使用 cv 的主要原因是我们可以阻塞我们的线程而不阻塞其他线程(它在等待时解锁互斥锁cv).我们只需要发出条件已完成的信号,我们就可以解除阻塞(释放)线程并执行我们想要的功能。我正在使用 pthread_cond_timedwait()
因为我可以在我想要的时间阻塞我的线程。