C++ asio、线程和同步
这是有点相关,但我想我需要知道多一点。几天来,我一直在想如何做到这一点(同时在其他部件上工作),但现在是我咬紧牙关实现多线程的时候了。另外,我想要的信息比问题链接的信息要多一些 首先,关于多线程。因为我一直在测试我的代码,所以我没有为任何多线程而烦恼。它只是一个控制台应用程序,启动到测试服务器的连接,然后处理所有其他内容。主循环是这样的:C++ asio、线程和同步,c++,boost,boost-asio,C++,Boost,Boost Asio,这是有点相关,但我想我需要知道多一点。几天来,我一直在想如何做到这一点(同时在其他部件上工作),但现在是我咬紧牙关实现多线程的时候了。另外,我想要的信息比问题链接的信息要多一些 首先,关于多线程。因为我一直在测试我的代码,所以我没有为任何多线程而烦恼。它只是一个控制台应用程序,启动到测试服务器的连接,然后处理所有其他内容。主循环是这样的: while(true) { Root::instance().performIO(); // calls io_service::runOne();
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
当我编写主应用程序时,我猜这个解决方案是不可接受的(因为它必须在消息循环中调用,这虽然可能,但在消息队列阻塞等待消息时会出现问题。您可以更改它,使消息循环不阻塞,但这不会通过屋顶打击CPU使用率吗?)
解决方案似乎是抛出另一个线程。好吧,好吧。但我已经读到了io_service::run()
当没有工作要做时返回。这是什么?当没有数据或没有连接时返回?如果至少有一个连接存在,它会保持活动状态吗?如果存在,这并不是什么问题,因为我只需要在建立第一个连接时启动一个新线程,如果在没有任何事情发生时所有线程都停止,我会很高兴。我想我对“无事可做”的定义感到困惑
然后,我不得不担心我的boost线程与我的主GUI线程是否同步。因此,我想我的问题是:
boost::asio::post
实现同步,以便稍后在IO_服务中调用就您对文档的评论而言,I thing Asio是文档化程度更好的boost库之一,它提供了清晰的示例
boost::io_service::run()
将仅在无事可做时返回,因此没有挂起的异步操作,例如异步接受/连接、异步读/写或异步计时器等待。因此,在调用io\u service::run()
之前,首先必须启动任何异步操作
我没有你有控制台或GUI应用程序吗?在任何情况下,多线程看起来都是一种过度使用。您可以将Asio与消息循环结合使用。如果是win32 GUI,则可以从OnIdle()处理程序调用io_service::run_one()。对于控制台应用程序,您可以设置定期(每200ms?)检查用户输入的截止时间计时器,并将其与io\u service::run()
一起使用。一切都在单线程中,大大简化了解决方案
1) 使用的最佳实践方式是什么
客户端应用程序中的boost::asio
关于线程和保持
他们还活着
作为一个例子,调用io_service::run
的线程池是可伸缩性最好、最容易实现的
2) 从主端口写入套接字时
线程到IO线程,是
使用
boost::asio::post,以便调用
稍后在io_服务中发生
您需要使用来保护可由多个线程调用的任何处理程序。请看,因为它可能会帮助您,以及这个例子
3) 当收到数据时,人们如何
将数据返回到UI线程?在里面
过去我使用完成端口时,
我做了一个特别的活动,可以发布
将数据返回到主UI线程
使用::SendMessage。不是
很优雅,但很有效
当您向io\u服务发布异步事件时,以boost::function
的形式提供回调如何?然后事件处理程序可以调用回调并用结果更新UI
当收到数据时,人们如何将数据返回到UI线程?在过去,当我使用完成端口时,我创建了一个特殊事件,可以使用::sendmages将数据发布回主UI线程。虽然不雅致,但很管用
::PostMessage可能更合适
除非所有内容都在一个线程中运行,否则必须使用这些机制将事件安全地发布到UI线程 谢谢你的回复。当你说有几种可能性时,你过去使用过哪些?@Moo Juice,我从来没有遇到过需要一个特定的GUI线程来处理数据的情况。我只是使用了回调机制,处理来自io_服务线程的数据。gui线程读取的某种形式的消息队列可用于指示新数据的到达。或者您可以简单地使用条件变量。真的取决于