我是C++ 11中线程的新手。我有两个线程,我想让他们在同一时间开始。我可以想到两种方法(如下)。但是,似乎没有一个像我预期的那样工作。他们在启动另一个线程之前先启动一个线程。任何提示将不胜感激!另一个问题是我正在处理一个线程队列。所以我有两个消费者和四个生产者。下面的代码对消费者来说是正确的吗?有没有人可以提供参考?
for(int i = 1; i <= 2; i++)
auto c = async(launch::async, consumer, i);
auto c1 = async(launch::async, consumer, 1);
auto c2 = async(launch::async, consumer, 2);
3条答案
按热度按时间fjaof16o1#
其他答案所说的不可能保证两个线程同时启动是正确的。不过,如果你想接近,有不同的方法可以做到这一点。
一种方法是使用一组std::promises来指示一切就绪的时间。每个线程设置一个promise来表示它已经准备好了,然后等待从第三个std::promise获取的std::shared_future(的副本);主线程等待来自所有线程的所有承诺被设置,然后触发线程进行。这样可以确保每个线程都已启动,并且刚好在应该并发运行的代码块之前。
注意:这个答案的大部分内容是从Anthony威廉姆斯的“C++ Concurrency in Action”(第311-312页)中复制的,但我修改了代码以适应问题中的示例。
qlzsbp2j2#
要同时启动两个线程,我认为没有其他方法比首先启动2个线程的经典方式,然后阻止他们使用一个障碍,以同步他们,但释放广播没有保证重新调度他们都在同一时间。或者,你可以旋转检查一个全局时间计数器或其他东西,但即使这样。..
yiytaume3#
一次启动两个线程是不可能的。CPU一次只能做一件事。它通过停止一个线程,保存寄存器状态,恢复另一个线程的状态,并执行该线程一段时间来执行线程。可以这样想(虽然不完全是这样)。
CPU说
因此,您可以在非常接近的位置启动它们,但不能在完全相同的时间启动。