在下面的例子中,我使用的是 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 ) );
}
问题 1
现在我的问题是,上述方法是否比启动独立线程(例如通过使用boost::thread
)更快、更有效我知道在独立线程的情况下,例如通过boost::thread
启动线程可能不是线性的(线程 2 可能在线程 1 之前运行)我的问题是如果只涉及一个线程,哪种机制会更快?是否有任何开销因为 eof boost::bind
问题 2 在上面的示例中,启动了 2 个等待工作的线程(线程 1 和线程 2)。现在我想知道当连续给出 2 个工作时究竟会发生什么
for(int i=0;i<2;i++)
{
strand.post( boost::bind( &PrintNum, i ) );
}
每个线程都有一项工作,但是线程 2 不会在线程 1 之前完成。我的问题是线程 2 在线程 1 启动时会发生什么,它甚至PrintNum
在线程 1 启动时进入方法。那么在这种情况下,就性能而言,拥有多个线程有什么意义呢?