boost::asio::io_service::p ost 是原子的吗?
Is boost::asio::io_service::post atomic?
给定一个boost::asio::io_service io
在启动io.run()
的线程以外的线程上调用io.post(...)
是否安全?
例如:
boost::asio::io_service io;
void f()
{
/* do something */
io.post(&f);
}
void g()
{
/* do something else */
io.post(&g)
}
int main()
{
std::thread t1(&f);
std::thread t2(&g);
io.run();
t1.join();
t2.join();
return 0;
}
我假设io_service
使用某种内部数据结构(例如队列(,并且发布会改变此数据结构(例如推送到队列(。 我担心的是数据结构可能是也可能不是线程安全的。
我四处搜索,但一直无法找到这个问题的直接答案,尽管我所看到的一切似乎都表明post()
线程安全的(即原子的(。 有人可以验证吗?
io_service::post
是thread_safe,从不同的线程发布就好了(通常需要在多线程asio环境中执行此操作(。
但是,您的示例具有一些争用条件:
io.run()
可能会在子线程开始运行之前完成,因此在发布任何内容之前完成。 如果你想避免这种情况,它需要运行((,直到满足特定的停止条件(例如,从发布的处理程序发出信号(。io_service::work
也可以提供帮助。
相关文章:
- C++中原子的替代品<variant>
- 调用原子的 store() 时可以调用基类型类的函数吗?C++
- 为什么 C++20 不使用"requires"来限制原子的 T<T>?
- boost::asio::io_service::p ost 是原子的吗?
- 原子的矢量完全线程安全?
- std::包含原子的类的向量
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 标准::原子的锁在哪里
- stat() 相对于文件系统是原子的
- 试图最大程度地减少对每次迭代的原子的检查
- 原子的类内初始化
- 对 c++ 11 原子变量的操作实际上是原子的
- 如何配置 g++,以便 x++ 是原子的(Ubuntu,openmp)
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- writev() 真的是原子的吗?
- 当某些错误可以接受时,顺序加载存储原子的内存顺序应该是什么
- “weak_ptr”和“shared_ptr”访问是原子的
- 原子的正确用法
- fetch_sub真的是原子的吗
- 0-原子的初始化是否保证将值成员设置为0