C++异步线程同时运行

9cbw7uwe  于 2023-05-02  发布在  其他
关注(0)|答案(3)|浏览(135)

我是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);
fjaof16o

fjaof16o1#

其他答案所说的不可能保证两个线程同时启动是正确的。不过,如果你想接近,有不同的方法可以做到这一点。
一种方法是使用一组std::promises来指示一切就绪的时间。每个线程设置一个promise来表示它已经准备好了,然后等待从第三个std::promise获取的std::shared_future(的副本);主线程等待来自所有线程的所有承诺被设置,然后触发线程进行。这样可以确保每个线程都已启动,并且刚好在应该并发运行的代码块之前。

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;
}

注意:这个答案的大部分内容是从Anthony威廉姆斯的“C++ Concurrency in Action”(第311-312页)中复制的,但我修改了代码以适应问题中的示例。

qlzsbp2j

qlzsbp2j2#

要同时启动两个线程,我认为没有其他方法比首先启动2个线程的经典方式,然后阻止他们使用一个障碍,以同步他们,但释放广播没有保证重新调度他们都在同一时间。或者,你可以旋转检查一个全局时间计数器或其他东西,但即使这样。..

yiytaume

yiytaume3#

一次启动两个线程是不可能的。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..

因此,您可以在非常接近的位置启动它们,但不能在完全相同的时间启动。

相关问题