这与this question有些相关,但我认为我需要多了解一点。我一直在试着让我的头脑几天(在其他部分工作的同时)如何做到这一点,但现在是时候让我咬紧牙关并获得多线程。而且,我比有关问题的信息多一点。boost :: asio,线程和同步
首先,关于多线程。由于我一直在测试我的代码,所以我没有为任何多线程所困扰。它只是一个控制台应用程序,它启动与测试服务器的连接,然后处理所有其他事情。主循环是这样的:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
当我写我的主要应用,我猜这个解决方案是不能接受的(因为它会在消息循环中被调用哪个,虽然可能会有当消息队列阻塞等待消息时,你可以改变它,这样消息循环就不会阻塞,但是这不会阻止CPU使用率通过屋顶?)
解决方案它似乎是要抛出另一个线索。好的。但是当我没有工作要做时,我已经读了io_service::run()
。那是什么?那是什么时候没有数据,或没有连接?如果至少有一个连接存在,它会保持活着吗?如果是这样,这不是什么大问题,因为我只需要在第一次连接时创建一个新线程,并且我很高兴如果一切都停止时就停止了。我想我对'没有工作要做'的定义感到困惑。
然后我不得不担心同步我的提升线程与我的主要GUI线程。所以,我想我的问题是:
- 在客户端应用程序中使用boost :: asio关于线程并保持它们活着的最佳实践方式是什么?
- 当从主线程写入套接字到IO线程时,是否使用
boost::asio::post
实现同步,以便稍后在io_service中发生该调用? - 当收到数据时,人们如何将数据返回到UI线程?在过去,当我使用完成端口时,我做了一个特殊的事件,可以使用:: SendMessage将数据发送回主UI线程。这不是优雅,但它的工作。
今天我会再读一些,但如果能够从已经完成这项工作的人那里得到正面评价,那将是一件好事。 Boost :: asio文档并不是很好,迄今为止我的大部分工作都是基于一些文档,一些试验/错误以及网络上的一些示例代码。
+1 io_service :: work是我自己解决这个问题的方法。 – 2011-01-19 13:31:59
感谢您的回复。当你说有几种可能性时,过去你曾使用过什么? – 2011-01-19 14:11:11