- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的示例中,我使用的是 boost ASIO,这里有一个线程已准备就绪,并且一直在等待作业执行。它将始终线性地执行作业(就像我理解的作业存储在队列中一样)以下代码片段解释我的观点。
void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
io_service->run();
}
void PrintNum( int x )
{
//Do somejon
}
boost::shared_ptr< boost::asio::io_service > io_service( new boost::asio::io_service);
boost::shared_ptr< boost::asio::io_service::work > work(new boost::asio::io_service::work( *io_service ));
boost::asio::io_service::strand strand( *io_service );
worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
//Give the thread (which is already active) some work to do
for(int i=0;i<2;i++)
{
strand.post( boost::bind( &PrintNum, i ) );
}
问题一
现在我的问题是上述方法是否比启动独立线程(例如通过使用 boost::thread
)更快更有效 我知道在独立线程的情况下,例如 boost::thread
线程的启动可能不是线性的(线程 2 可能在线程 1 之前运行)我的问题是万一只涉及一个线程,哪种机制会更快?是否有任何开销因为eof boost::bind
问题 2在上面的示例中,启动了 2 个等待工作的线程(thread1 和 thread2)。现在我想知道当连续给出 2 个工作时到底发生了什么
for(int i=0;i<2;i++)
{
strand.post( boost::bind( &PrintNum, i ) );
}
每个线程都有一份工作,但是线程 2 不会在线程 1 之前完成。我的问题是线程 2 在线程 1 启动时发生了什么,它甚至在线程 1 启动时进入 PrintNum
方法。那么在这种情况下,在性能方面拥有多个线程有什么意义呢?
最佳答案
线程和异步 i/o 不是性能优化。它们是用于隐藏延迟的技术。
问题 1:boost::bind 相对便宜。它只是创建一个函数对象。启动线程非常昂贵。线程之间的同步有点昂贵(不像创建新线程那样昂贵,但比创建函数对象更昂贵)。像 strand.post() 这样的操作可能会进行大量同步(在线程之间传递值,确保事情按特定顺序发生)。
问题 2:线程 2(假设库创建它而不是以某种方式优化它)将阻塞等待线程 1 在线程 2 甚至调用 PrintNum 之前完成其处理。
如果两个线程要花费大部分时间互相阻塞,那么拥有两个线程是没有意义的。
大多数情况下,依赖操作的序列应该映射到同一个线程。 (就像 PrintNum(0); PrintNum(1) 在你的情况下:你希望它们按顺序运行,所以把它们放在同一个线程中。)
仅当您有几乎完全独立于您当前正在做的事情要做时才开始一个新线程。一个例子是:您正在编写一个与多个用户或设备建立连接的服务器。由于每个用户或设备都以自己的速度工作,请求服务或响应服务器的问题,因此您可能希望创建一个线程来与每个用户或设备进行交互。这样,如果一个用户离开几分钟,所有其他用户都可以继续与他们的线程交互,而不会阻塞等待离开的用户。但是你为单个用户执行的服务是按一定顺序进行的(“用户要求 A,所以我查找 A,对其进行一些处理,然后将其发回给用户”)所以不要分割你的服务为一个用户执行不同的线程。
关于c++ - 使用 IO_Service 已经创建的线程效率更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026113/
我有一个 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 方法立即返回并且线程终止。
我是一名优秀的程序员,十分优秀!