C++ std::atomic_bool标志的内存顺序

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

我正在阅读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 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=
具有简单的优点(即代码更清晰),不太可能带来任何性能问题,尤其是在大多数平台上,原子布尔函数与处理器操作的映射非常紧密。

析构函数中没有任何其他代码-为什么内存顺序的具体选择很重要?线程池构造函数和析构函数不在同一线程上运行。