c ++线程异步同时运行

时间:2014-05-19 00:18:05

标签: c++ multithreading asynchronous

我是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 个答案:

答案 0 :(得分:2)

其他答案所说的不可能保证两个线程同时启动是真的。不过,如果你想要接近,有不同的方法来做到这一点。

一种方法是使用一组std :: promises来指示何时一切准备就绪。每个线程设置一个承诺,表明它已经准备就绪,然后等待从第三个std :: promise获得的std :: shared_future的副本(副本);主线程等待所有线程的所有promises被设置,然后触发线程去。这可以确保每个线程都已启动,并且就在应该同时运行的代码块之前。

std::promise<void> go, ready1, ready2; // Promises for ready and go signals
std::shared_future<void> ready(go.get_future()); // Get future for the go signal
std::future<void> done1, done2; // Get futures to indicate that threads have finished
try
{
    done1 = std::async(std::launch::async, 
        [ready, &ready1]
    {
        ready1.set_value(); // Set this thread's ready signal
        ready.wait(); // Wait for ready signal from main thread
        consumer(1);
    });
    done2 = std::async(std::launch::async,
        [ready, &ready2]
    {
        ready2.set_value(); // Set this thread's ready signal
        ready.wait(); // Wait for ready signal from main thread
        consumer(2);
    });
    // Wait for threads to ready up
    ready1.get_future().wait();
    ready2.get_future().wait();
    // Signal threads to begin the real work
    go.set_value();
    // Wait for threads to finish
    done1.get();
    done2.get();
}
catch (...)
{
    go.set_value(); // Avoid chance of dangling thread
    throw;
}

注意:大部分答案都是从&#34; C ++ Concurrency in Action&#34;安东尼威廉姆斯(第311-312页),但我修改了代码以适应问题中的例子。

答案 1 :(得分:1)

同时启动两个线程除了首先以经典方式启动2个线程之外别无其他方式,然后使用屏障来阻止它们同步它们,但是发布广播并不能保证同时重新安排它们。 或者,您可以旋转检查全球时间计数器或其他东西,但即便如此......

答案 2 :(得分:0)

一次启动两个线程是不可能的。 CPU一次只能做一件事。它通过停止一个线程,保存寄存器状态,恢复其他线程的线程,并执行该线程一段时间来进行线程化。想想它更像是这样(虽然不完全是这样的)。

hey cpu, i want to do two things at once, eat apples and bananas

CPU说

ok, well, heres what we will do. Eat a bit of an apple
now, eat some banana
repeat..

因此,您可以近距离启动它们,但不能在同一时间启动它们。