- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 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));
}
};
附言join_threads 是一个简单的类,它在销毁和 thread_safe_queue 是一个……线程安全队列!
我的问题是关于 bool 标志 std::atomic_bool done。我读到使用默认赋值运算符与使用顺序一致的内存排序是一样的。
完成=真。 -> done.store(true, std::memory_order_seq_cst)
在这种情况下真的有必要吗?使用发布/获取排序 甚至宽松 排序还不够吗?工作线程只是在 bool 值上循环,显然没有任何其他内存访问可以与之同步。
我是否过度优化或遗漏了什么?
最佳答案
我想你没有误解。顺序一致的访问比最低要求更受限制。
在这种情况下,使用 std::atomic::operator=
具有简单的优点(即更清晰的代码),并且不太可能引入任何性能问题 - 特别是在大多数情况下平台,原子 bool 值非常紧密地映射到处理器操作。
关于c++ - std::atomic_bool 标志的内存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30302013/
我有两个线程和一个由第二个线程设置的标志。我可以使用 atomic_bool,但我希望能够等待* 在第一个线程上设置标志。我该怎么做? 我猜我不能使用condition_variable,因为如果第二
我正在阅读 Anthony Williams 的“C++ Concurrency in Action”,我看到了这段代码,它是线程池的简单实现。 class thread_pool { std
我有一个包含两个进程的程序,这些进程使用共享内存进行通信。在 ctrl-c 上,我希望两个进程都退出。我正在使用一个名为 stop 的 atomic_bool 变量来通知进程在设置为 true 时保持
我想使用 std::atomic_bool 因为我想要一个应该被不同线程访问的 bool 值。 它是一个 static 成员变量。问题是我想用 false 作为第一个状态来初始化它。通常我会这样做:s
朴素的 bool 否定 std::atomic_bool b; b = !b; 似乎不是原子的。我怀疑这是因为 operator! 触发了转换为纯 bool。一个人将如何原子地执行等效的否定?以下代码
如主题所述:vector涉及以与 vector 相同的方式合并 vector 元素? 最佳答案 没有。 std::vector只有一个专业,std::vector . bool和 std::atmoi
我有一个从套接字读取并生成数据的线程。每次操作后,线程都会检查一个 std::atomic_bool 标志以确定它是否必须提前退出。 为了取消操作,我将取消标志设置为true,然后在工作线程对象上调用
我正在尝试编译声明 std::atomic_bool 类型变量的 C++11 代码。这是在带有 clang 的 Mac OS 10.8.2 上: clang --version Apple clang
我正在使用 VC++ 编译我的程序(使用 Visual Studio 2015,更新 3),但一些片段无法编译。 基本上,我想绑定(bind)一个函数,该函数使用原子 bool 值获取对原子 bool
我是一名优秀的程序员,十分优秀!