- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想让程序等到它完成所有正在运行的线程,这与 ioService.stop();
不同,后者无需等待即可停止 ioService
。我尝试了以下代码,它工作正常,但没有等待线程完成就停止了 ioService
。
#include <iostream>
#include <boost/asio/io_service.hpp>
#include <boost/bind.hpp>
#include <boost/thread/thread.hpp>
void myTask (std::string &str);
int main(int argc, char **argv){
uint16_t total_threads = 4;
/*
* Create an asio::io_service and a thread_group
*/
boost::asio::io_service ioService;
boost::thread_group threadpool;
/*
* This will start the ioService processing loop.
*/
boost::asio::io_service::work work(ioService);
/*
* This will add threads to the thread pool.
*/
for (std::size_t i = 0; i < total_threads; ++i)
threadpool.create_thread(
boost::bind(&boost::asio::io_service::run, &ioService));
/*
* This will assign tasks to the thread pool.
*/
std::string str = "Hello world";
ioService.post(boost::bind(myTask, std::ref(str) ));
ioService.stop();
/*
* thread pool are finished with
* their assigned tasks and 'join' them.
*/
threadpool.join_all();
return 0;
}
void myTask (std::string &str){
std::cout << str << std::endl;
}
编译:-lboost_serialization -lboost_thread -lboost_system
最佳答案
您的问题是您正在创建 work
作为堆栈上的变量。 work
告诉 io_service 还有工作要做。来自手册:
Destructor notifies the io_service that the work is complete.
由于工作是在堆栈上的 main 中创建的,因此它的生命周期比您希望的要长。在 main 退出之前,它不会被销毁。相反,在堆上创建它,因此您可以显式销毁它。将其更改为:
using namespace boost::asio;
boost::scoped_ptr<io_service::work> work(new io_service::work(ioService));
然后,稍后,当您想要告诉 io_service 在完成所有未完成的工作后停止时,不要停止 io_service 而是销毁“工作”,然后等待线程完成。
work.reset();
threadpool.join_all();
这将调用 ~work()
,这将从 io_service 中删除工作对象。这反过来会导致io_service::run
在最后一个挂起的操作完成时退出。
一些注意事项:
io_service::work work(io_service);
太困惑了。我会写类似 io_service::work some_work(io_service);
的东西io_service.post(... std::ref(str));
您正在传递对 io_service post 操作的引用。变量 str 必须存在足够长的时间才能完成任务。我确信这只是为了举例。在现实世界的应用程序中,确保传递给工作对象的参数不会过早销毁可能出奇地困难。我用 shared_ptr<>
很多,或者在不可能的情况下,我有时会用 boost::atomic关于c++ - 在每个线程完成后停止 io_service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50076415/
我有一个 ip::udp::socket用 io_service 构建.只有一个 boost::thread调用 io_service::run()方法,以及 io_service::work 的一个
我为异步 io_service 工作运行 aync 作业线程。 我想销毁用于异步作业的资源。 boost::asio::io_service boost::asio::io_service::work
我有一个 boost::asio 线程池,它有一个 asio::io_service和 asio::work : boost::asio::io_service m_service; boost::a
我正在编写多线程 TCP 服务器,基于应用程序设计,我需要有多个线程,每个线程都有 io_service。 通过该设计,我需要接受来自一个Thread/io_service 的连接,进行身份验证过程(
如果我io_service::run()只在一个线程中运行,那么io_service::post()调用是在我要求它们执行的顺序相同,或者它们可以按任意顺序执行,我仍然需要使用 strand 来强制序
boost::asio::io_service m_io_service; boost::asio::io_service::work m_work(m_io_service); m_io_servi
长话短说,我的代码: #include #include #include #include #include #include namespace ba = boost::asio; n
我的简化问题 我阅读了this thread,并试图删除io_service对象。我做这个 m_IO.stop(); m_IO.~io_service(); m_IO是boost::asio::io_
我使用 boost::asio::io_service 来处理 Foo 中的工作。现在它工作正常,直到我退出 ~Foo 并卡在 io_service 析构函数(在 service_registry 的
我想在里面的类中周期性地制作一个10秒的计时器,但是它不起作用。它会在 10 秒内第一次打印计数。但在那之后,它不会再等待 10 秒。具体代码。 #include #include #includ
我正在尝试运行 udp 服务器。问题是阻塞了 io_service 上的 run() 调用。所以我决定使用 boost bind 在其他线程上运行这个方法。结果主线程执行超出了 DictionaryI
我一直在阅读 boost asio 文档,特别是关于 Proactor 设计的。 当我看到这个标题的时候 前摄器设计模式:无线程的并发 我的理解是,asio 的用户不需要创建额外的线程来执行异步 IO
我想让程序等到它完成所有正在运行的线程,这与 ioService.stop(); 不同,后者无需等待即可停止 ioService。我尝试了以下代码,它工作正常,但没有等待线程完成就停止了 ioServ
为什么在这个简单的类中,如果我直接使用 io.run() 函数将被调用,否则如果要求运行到其他线程,打印将不会被调用? #include #include #include using name
正在尝试学习 asio,我正在关注网站上的示例。 为什么需要 io_service 以及它的具体作用是什么?为什么我在执行异步操作时需要将它发送到几乎所有其他函数,为什么它不能在第一次“绑定(bind
我正在使用boost::io_service构建并行执行计算作业的线程池。有些作业不允许同时运行,我认为这是boost::io_service::strand的理想应用。作为,执行顺序作业的顺序与无关
我正在编写一个网关服务,它监听网络套接字并将接收到的数据包路由到单独的守护进程。我打算使用 boost asio,但我遇到了几个问题。这是我计划实现的服务器的设计: 网关将使用 boost asio
我正在尝试实现一个包含两个处理循环的 C++ 应用程序。当前,第一个处理循环(boost 的 io_service::run)阻止了第二个处理循环的执行。 利用线程或 std::async 方法的方法
我正在尝试学习 io_service 并使用共享指针。我希望代码无限地工作,直到我像这样调用 stop 方法或某事。不幸的是,在屏幕上看到 workHandler 的输出后,程序关闭了。任何人都可以解
我更喜欢使用 io_service 的方式是在应用程序启动时创建一个线程来执行 io_service的运行方法。问题是,如果 io_service 没有任务,它的 run 方法立即返回并且线程终止。
我是一名优秀的程序员,十分优秀!