假设我有4个线程应该从数组中读取数据,4个线程应该更新数组中的内容。应该如何让读取线程在更新线程之前完成所有工作,但同时调用所有8个线程。
thread t1 = thread(func,args);//READ
thread t2 = thread(func2,args);//WRITE
thread t3 = thread(func,args);//READ
thread t4 = thread(func,args);//READ
thread t5 = thread(func,args);//READ
thread t6 = thread(func2,args);//WRITE
thread t7 = thread(func2,args);//WRITE
thread t8 = thread(func2,args);//WRITE在那之后,让我们假设我确实加入了所有这些函数的join()。为了澄清,我想让函数实现优先级,但我不确定如何实现它。
我遇到的主要问题是,即使我使用condition_variables,它们也会同时启动,所以至少一些写线程仍然会关闭。
发布于 2021-05-19 04:02:54
为此,您必须使用标准库中存在的许多同步对象中的一个。有a lot to choose from,但最简单的是std::latch。
这个同步原语的工作方式是持有一个内部计数器(在构造函数中初始化),该计数器可以通过调用count_down来递减。当计数达到零时,使用wait等待的线程将被允许工作。
以对所有线程都可见的方式声明std::latch。将其初始化为4,即4个读取器线程必须在锁存器打开和写入器开始之前完成它们的工作:
std::latch global_latch{4};在读取器线程中,在完成其任务之后,但在退出之前,调用count_down来告诉锁存器线程已完成工作:
void func(args_t args)
{
// read
global_latch.count_down();
}另一方面,在写入器线程中,在其工作开始时,使用wait等待锁存器,直到所有读取器都完成:
void func2(args_t args)
{
latch.wait();
// write
}请注意,std::latch是在C++20中标准化的。如果您使用的是C++的早期版本,则可能必须使用std::experimental::latch,或者使用流行的Boost库中的boost::thread::latch。幸运的是,界面是相同的。
发布于 2021-05-19 04:00:23
在创建任何更新线程之前,让你的主线程在所有读线程上调用join()。在线程退出之前,join()不会返回。
https://stackoverflow.com/questions/67593168
复制相似问题