std::atomic_bool 标志的内存顺序
Memory order of an std::atomic_bool flag
我正在阅读 Anthony Williams 的 "C++ Concurrency in Action",我看到了这段代码,它是线程池的简单实现。
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));
}
};
P.S。 join_threads 是一个简单的 class ,它在销毁时加入线程并
thread_safe_queue 是一个...线程安全队列!
我的问题是关于布尔标志 std::atomic_bool done。我读过使用默认赋值运算符与使用 顺序一致的内存排序.
相同
完成=真。 -> done.store(真,std::memory_order_seq_cst)
在这种情况下真的有必要吗?使用 release/acquiring ordering 甚至 relaxed 还不够吗?
工作线程只是在 bool 值上循环,显然没有任何其他内存访问可以与之同步。
我是优化过度了还是遗漏了什么?
我想你没有误会。顺序一致的访问比最低要求更受限制。
在这种情况下,使用 std::atomic::operator=
具有简单的优点(即更清晰的代码),并且不太可能引入任何性能问题 - 特别是在大多数平台上,原子布尔值映射到处理器操作非常接近。
我正在阅读 Anthony Williams 的 "C++ Concurrency in Action",我看到了这段代码,它是线程池的简单实现。
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));
}
};
P.S。 join_threads 是一个简单的 class ,它在销毁时加入线程并 thread_safe_queue 是一个...线程安全队列!
我的问题是关于布尔标志 std::atomic_bool done。我读过使用默认赋值运算符与使用 顺序一致的内存排序.
相同完成=真。 -> done.store(真,std::memory_order_seq_cst)
在这种情况下真的有必要吗?使用 release/acquiring ordering 甚至 relaxed 还不够吗? 工作线程只是在 bool 值上循环,显然没有任何其他内存访问可以与之同步。
我是优化过度了还是遗漏了什么?
我想你没有误会。顺序一致的访问比最低要求更受限制。
在这种情况下,使用 std::atomic::operator=
具有简单的优点(即更清晰的代码),并且不太可能引入任何性能问题 - 特别是在大多数平台上,原子布尔值映射到处理器操作非常接近。