C++ std::atomic_bool标志的内存顺序
我正在阅读Anthony Williams的“C++并发操作”,我偶然发现了这段代码,一个线程池的简单实现C++ std::atomic_bool标志的内存顺序,c++,multithreading,atomic,memory-model,C++,Multithreading,Atomic,Memory Model,我正在阅读Anthony Williams的“C++并发操作”,我偶然发现了这段代码,一个线程池的简单实现 class thread_pool { std::atomic_bool done; thread_safe_queue<std::function<void()> > work_queue; std::vector<std::thread> threads; join_threads joiner; void
class thread_pool
{
std::atomic_bool done;
thread_safe_queue<std::function<void()> > work_queue;
std::vector<std::thread> threads;
join_threads joiner;
void worker_thread()
{
while(!done)
{
std::function<void()> task;
if(work_queue.try_pop(task))
{
task();
}
else
{
std::this_thread::yield();
}
}
}
public:
thread_pool():
done(false),joiner(threads)
{
unsigned const thread_count=std::thread::hardware_concurrency();
try
{
for(unsigned i=0;i<thread_count;++i)
{
threads.push_back(
std::thread(&thread_pool::worker_thread,this));
}
}
catch(...)
{
done=true;
throw;
}
}
~thread_pool()
{
done=true;
}
template<typename FunctionType>
void submit(FunctionType f)
{
work_queue.push(std::function<void()>(f));
}
};
类线程池
{
标准::原子波完成;
线程安全队列工作队列;
向量线程;
连接螺纹连接件;
无效工作线程()
{
而(!完成)
{
功能任务;
如果(工作队列。尝试弹出(任务))
{
任务();
}
其他的
{
std::this_thread::yield();
}
}
}
公众:
线程池():
完成(错误),接合(螺纹)
{
unsigned const thread_count=std::thread::hardware_concurrency();
尝试
{
对于(unsigned i=0;i我不认为您误解了。顺序一致访问比最低要求更受限制
在这种情况下,使用std::atomic::operator=
具有简单的优点(即代码更清晰),不太可能带来任何性能问题,尤其是在大多数平台上,原子布尔函数与处理器操作的映射非常紧密。析构函数中没有任何其他代码-为什么内存顺序的具体选择很重要?线程池构造函数和析构函数不在同一线程上运行。