【发布时间】:2015-07-07 17:01:02
【问题描述】:
我有一个简单的程序,我想在其中输出数字 1-100,一个线程输出所有奇数,另一个线程输出所有偶数。使用 lock_guard,这是一项相当容易的任务。代码如下:
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
std::mutex m;
void print_numbers(int i)
{
for (i; i <= 100; i++)
{
std::lock_guard<std::mutex> locker(m);
std::cout << i << std::endl;
++i;
}
}
int main()
{
std::thread t1(print_numbers, 0);
std::thread t2(print_numbers, 1);
t1.join();
t2.join();
return 0;
}
我的问题是,我怎样才能使用条件变量来做到这一点,或者让它更优雅一点?
【问题讨论】:
-
一个简单的
std::mutex(和std::lock_guard)和一个std::condition_variable在某种程度上是正交概念。事实上,std::condition_variable实际上需要使用至少 2 个互斥锁,所以如果这更优雅,则值得商榷。您使用条件变量来唤醒线程以进行状态更改,因此这些类似于信号量,我看不出您的代码实际上是如何需要的。 -
我明白了,谢谢。不过,为了学习,您是否会提出一种使用两个带条件变量的互斥锁来实现相同结果的方法?
-
好吧,您的代码示例甚至不需要
std::mutex,这两个线程完全独立于i的副本运行,更改永远不会干扰或容易发生对于比赛条件。你的std:mutex m;是假的,不需要。 -
@πάνταῥεῖ:如何使用
std:condition_variable需要使用至少 2 个互斥锁? -
一般来说,当你有多个共享资源的消费者时,条件变量很有用,例如工人从队列中删除项目,并且有两个单独的考虑因素:资源是否可能处于消费者感兴趣的状态以及是否有人在考虑。您的互斥锁可以保护对
std::cout的访问,这绝对不是条件变量的用例。另一方面,您实现有序处理的愿望——虽然没有在示例中描述——可能会导致条件变量的用例,但可能会导致重新设计。
标签: c++ multithreading condition-variable