如何将线程的这种特殊情况与 C++ std::thread 同步

问题描述 投票:0回答:1

我需要一些帮助来解决以下情况:我有一个主程序,它启动同一函数的多个实例作为线程。被调用的函数至少分为两部分。首先,每个实例都必须先执行函数的第 1 部分,然后才能继续执行第 2 部分。这里我需要同步它们。为了更容易理解,我将编写一些示例代码: void TMainForm::foo(int numThreads) { std::cout << "Part 1: do some work" << std::endl; /* HERE NEEDS TO BE SOMETHING THAT CHECKS WHETHER EVERY INSTANCE HAS DONE PART 1 !!*/ std::cout << "Part 2: do some work" << std::endl; } //--------------------------------------------------------------------------- void TMainForm::StartingThreads() { int threads = std::thread::hardware_concurrency(); std::vector<std::thread> t(threads); for (int i = 0; i < threads; i++) t[i] = std::thread(foo, threads); for (int i = 0; i < threads; i++) t[i].join(); } //--------------------------------------------------------------------------- 我尝试使用互斥锁,但它对我不起作用。我增加了一个原子变量(比如说

atomic a
),如果该值小于
numThreads

,我就执行了mutex::lock。当最后一个实例完成它的工作时,它会完成一个 mutex::unlock。但我的线程在第 1 部分之后总是卡住。 有人有什么想法吗?

如果您使用的是 C++ 20,那么其他人已经给了您答案。如果你已经 17 岁或以上,那么我会制作一个你可以疯狂进行单元测试的课程。

c++ multithreading mutex thread-synchronization stdmutex
1个回答
0
投票

然后在您的代码中,将其中之一初始化为线程计数,然后在线程中:

barrier.done();
barrier.waitReady();

我正在就地编写此代码——可能不是完美的代码。还有其他方法可以使用 wait(您可以传递谓词),但这是我总是使用的模式。

© www.soinside.com 2019 - 2024. All rights reserved.