boost::asio绞线缠绕的线程无法立即工作
boost::asio strand wrapped thread is not working immediately
我最近使用了boost::asio::strand
。我在这方面缺乏经验。
我所面临的是,如果我在~function1
中用strand::wrap()
调用function1
,用strand::wrap()
调用function2
,则function2
正在等待function1
的完成。
ioservice->post(m_strand.wrap(boost::bind( function1 )));
ioservice->post(m_strand.wrap(boost::bind( function2 )));
如果我像这样更改代码,它就像我期望的一样工作
ioservice->post(m_strand.wrap(boost::bind( function1 )));
ioservice->post((boost::bind( function2 )));
这是因为m_strand正在对函数调用进行排队吗?
我在搜索中发现了什么;
boost::asio::strand保证,对于那些通过它调度的处理程序,一个正在执行的处理程序将被允许在下一个处理程序启动之前完成。无论调用io_service::run()的线程数量如何,都可以保证这一点。当然,这些处理程序仍然可以与未通过boost::asio::strand调度的其他处理程序同时执行,或者通过不同的boost::asio::strandobject调度的其他处理器。
启动异步操作时,每个回调处理程序使用boost::asio::strand对象包装。线束::wrap()函数返回一个新的处理程序,该处理程序自动分派通过boost::asio::strand对象包含的处理程序。通过包装使用相同boost::asio::strand的处理程序,我们正在确保它们不能同时执行。
在不等待function1
完成的情况下执行function2
需要做什么?(我知道我可以在没有线程或链的情况下执行它,但我想用strand::wrap()
调用它)
Strands被明确设计为一次只允许执行一个函数。
如果使用异步方法,那么当一个函数等待异步方法返回时,将允许其他函数在同一条链上执行。
如果您不使用异步方法,那么strands将简单地以串行方式执行发布的函数,正如您所观察到的那样。
- 工作线程在执行太快后永久休眠
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 无法将接口从主线程封送到工作线程
- 在 C++ 中扩展作业/工作线程多线程系统
- Qt C++ - 如何将数据从工作线程传递到主线程?
- 从线程池工作线程使用 GetQueuedCompletionStatus 的奇怪行为
- QtThread:I/O 队列的工作线程
- 将信号从工作线程类连接到控制器类 - QThreads
- Qt:工作线程和 GUI 事件之间的关系
- 将数据集几乎平均分配给工作线程
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 在工作线程中使用 QT 主窗口
- C++,pthreads:如何从多个线程停止工作线程
- 同步主线程和工作线程
- 从工作线程更新QtCharts的正确方法