c++ - 使用 IO_Service 已经创建的线程效率更高

标签 c++ multithreading boost-asio

在下面的示例中,我使用的是 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/

相关文章:

c++ - Boost.ASIO UDP 套接字 : sink all the packets

c++ - boost::asio::async_write 和缓冲区超过 65536 字节

c++ - 与 boost::property_tree XML 解析器一起使用时 boost::coroutine 库崩溃

c++ - 服务器应用程序框架(最好使用 BOOST C++)

python - 当我使用 threading.Lock 锁定线程操作时,为什么它的输出不为 0?

c++ - AudioOutputUnitStart 失败,OSStatus = -66637(如何从 C++ 打印 OSStatus)

c# - 如何运行使用相同外部变量的任务?

java - StampedLock 类的 tryOptimisticRead() 方法到底是如何工作的?

c++ - CPU % 约为 "what can be done"而不是 "what is happening"是否正常?

c++ - 为什么使用 __stdcall 作为函数指针