Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ asio、线程和同步_C++_Boost_Boost Asio - Fatal编程技术网

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并使线程保持活动状态的最佳实践方式是什么
  • 当从主线程向IO线程写入套接字时,是否使用
    boost::asio::post
    实现同步,以便稍后在IO_服务中调用
  • 当接收到数据时,人们如何将数据返回到UI线程?在过去,当我使用完成端口时,我制作了一个特殊事件,可以使用::SendMessage将数据返回到主UI线程。这不是很优雅,但很有效
  • 今天我将阅读更多内容,但如果能从已经做过这项工作的人那里得到一些启发,那将是一件非常棒的事情。Boost::asio文档并不出色,到目前为止,我的大部分工作都是基于一些文档、一些尝试/错误、一些web上的示例代码。

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

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

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


    就您对文档的评论而言,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线程读取的某种形式的消息队列可用于指示新数据的到达。或者您可以简单地使用条件变量。真的取决于