【发布时间】:2017-11-23 20:34:44
【问题描述】:
这可能是多线程编程方面的一个基本问题,但我真的想在没有任何并发数据结构的情况下实现以下目标。 考虑代码:
class A
{
std::stack<int> s;
public:
A()
{
s.push(7); s.push(6); s.push(5); s.push(4); s.push(3); s.push(2); s.push(1);
}
void process(int tid)
{
while (!s.empty())
{
std::unique_lock<std::mutex> lck(m);
std::cout << tid << " --> " << s.top() << '\n';
cv.wait(lck);
s.pop();
cv.notify_all();
lck.unlock();
}
}
std::mutex m;
std::condition_variable cv;
};
int main()
{
A a;
std::thread t1(&A::process, &a, 1);
std::thread t2(&A::process, &a, 2);
t1.join();
t2.join();
}
我希望每个线程都打印堆栈的顶部并将其弹出,以便输出看起来像这样:
1 --> 1
2 --> 2
1 --> 3
2 --> 4
...
所以只有 1 个线程应该进入 while 主体并只执行一次迭代。
但它总是输出:
1 --> 1
2 --> 1
然后无限等待
我该怎么做?
目前的解决方案有什么问题?
【问题讨论】:
-
我不知道这是否是您唯一的问题,但您永远不应该等待没有循环或 lambda 的条件变量。啊,您似乎也认为条件变量是某种信号量?或者类似的。
-
@Yakk 我宁愿考虑使用条件变量来提供一些同步,以便线程只执行循环的 1 次迭代
标签: c++ multithreading c++11 thread-synchronization