gpt4 book ai didi

c++ - boost::asio,线程和同步

转载 作者:可可西里 更新时间:2023-11-01 15:19:25 25 4
gpt4 key购买 nike

这与this question有些相关,但我想我需要了解更多。几天来,我一直在努力思考如何做到这一点(同时处理其他部分),但现在是我硬着头皮使用多线程的时候了。另外,我需要的信息比链接的问题多一些。

首先,关于多线程。因为我一直在测试我的代码,所以我没有为任何多线程而烦恼。它只是一个控制台应用程序,它启动与测试服务器的连接,然后处理其他所有内容。主循环是这样的:

while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}

当我编写我的主应用程序时,我猜这个解决方案是 Not Acceptable (因为它必须在消息循环中调用,虽然可能,但当消息队列阻塞等待消息时会出现问题. 你可以改变它,这样消息循环就不会阻塞,但这不会使 CPU 使用率飙升吗?)

解决方案似乎是在它上面抛出另一个线程。好的。但后来我读到 io_service::run() 在没有工作可做时返回。那是什么?那是没有数据或没有连接的时候吗?如果至少存在一个连接,它会保持事件状态吗?如果是这样,那不是什么大问题,因为我只需要在建立第一个连接时启动一个新线程,如果在没有任何事情发生时一切都停止了,我很高兴。我想我对“无工作可做”的定义感到困惑。

然后我不得不担心将我的 boost 线程与我的主 GUI 线程同步。所以,我想我的问题是:

  1. 在客户端应用程序中使用 boost::asio 关于线程并使它们保持事件状态的最佳实践方法是什么?
  2. 从主线程向 IO 线程写入套接字时,是否使用 boost::asio::post 实现了同步,以便稍后在 io_service 中进行调用?
  3. 收到数据后,人们如何将数据返回给 UI 线程?过去,当我使用完成端口时,我创建了一个特殊事件,可以使用::SendMessage 将数据发回主 UI 线程。这不是很优雅,但很管用。

我今天会阅读更多内容,但如果能从已经这样做过的人那里得到提醒,那就太好了。 Boost::asio 文档不是很好,到目前为止我的大部分工作都是基于一些文档、一些试验/错误以及网络上的一些示例代码。

最佳答案

1) 查看io_service::work .只要工作对象存在,io_service::run 就不会返回。因此,如果您开始清理、销毁工作对象、取消任何未完成的操作(例如套接字上的 async_read),请等待运行返回并清理您的资源。

2) io_service::post 将从运行 io_service 的线程异步执行给定的处理程序。回调可用于获取执行操作的结果。

3) 您需要某种形式的消息传递系统来将新数据通知您的 GUI 线程。这里有几种可能性。

就您对文档的评论而言,我认为 Asio 是文档更好的 boost 库之一,它带有清晰的示例。

关于c++ - boost::asio,线程和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com