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++ c++;线程在主线程上执行代码?_C++_Boost Thread - Fatal编程技术网

C++ c++;线程在主线程上执行代码?

C++ c++;线程在主线程上执行代码?,c++,boost-thread,C++,Boost Thread,在调用运行某些指令的boost::thread之后,是否可能返回到主线程 我的代码是基于proactor模式的,但是某个函数可能需要一些时间,所以为了不阻塞整个程序,我创建了一个运行该函数的线程。 当这个函数结束时,我需要调用另一个函数,但它必须在主线程上运行。 我有一个连接池,这不是线程安全的,我真的希望避免互斥 在主线程上运行函数(调用另一个线程)是否有一种稳定的方法 就像ObjectiveC中的PerformSelectorOnMainThread一样,我想您可能需要研究一下。它们将允许您

在调用运行某些指令的boost::thread之后,是否可能返回到主线程

我的代码是基于proactor模式的,但是某个函数可能需要一些时间,所以为了不阻塞整个程序,我创建了一个运行该函数的线程。 当这个函数结束时,我需要调用另一个函数,但它必须在主线程上运行。 我有一个连接池,这不是线程安全的,我真的希望避免互斥

在主线程上运行函数(调用另一个线程)是否有一种稳定的方法


就像ObjectiveC中的PerformSelectorOnMainThread一样,我想您可能需要研究一下。它们将允许您指定在哪个线程(链)上执行某些工作,并且它将自动在该链上排队

请注意,绞线实际上更像光纤(意思是:如果有比实际线程更多的绞线,那么这些绞线将被多路复用到可用的线程上)

IIRC这不会给你明确指定主线程的机会。然而,通常情况下,这并不是实际的需求:strand让您轻松做到的是确保strand中的操作在同一逻辑线程上运行,即strand中永远不可能存在并发性

琐事:Boost Asio io_service.run()是消息泵的一个示例


下面是Boost Asio的示例页面:

在多线程应用程序中(至少对我来说),主线程做的不多,所有内容都与启动时创建的其他线程相抵消。主线程只阻塞/等待(条件变量),直到指示我们可以退出。所有的工作都是在线程之间进行的,这使得事情变得更加容易


正如上面所建议的那样,最好的方法是使用消息队列(每个队列包装一个工作线程或池),您可以将消息发布到其中一个或另一个。通过回调和其他消息传递机制,您可以让“主”线程向工作线程发送消息以完成工作,并提供回调以在处理结果时将消息发回“主”线程。在此期间,“主”线程可以在等待结果的同时继续处理其他消息和操作,如果它还有其他工作要做。

如果您希望在主线程中运行函数,则必须实现某种类型的消息传递系统。例如,您将启动主线程,然后启动辅助线程。工作线程将完成它的工作,而主线程将等待来自工作线程的返回值(即,主线程将检查消息队列或类似性质的东西)。当工作线程完成时,它将向主线程的消息队列传递一个结构(即消息),该结构带有指向它希望主线程运行的函数的指针。您的消息可以非常简单:

struct message
{
    typedef void (*func_ptr)(void); //or whatever your function signature would be

    func_ptr function;
    bool finished;

    message(): function(NULL), finished(false) {}
};
因此,当工作线程完成时,它将创建一条新消息,初始化消息中的函数指针,并将该消息推回到主线程正在等待的队列中。然后主线程从队列中读取消息,并调用函数

顺便说一句,让主线程“等待”而不必将其保持在循环中并耗尽CPU周期的有效方法是在主线程和工作线程之间使用信号量或条件变量(如
boost::condition


还有一个提示。。。“消息队列”只是一个
std::queue
,具有主线程读取、工作线程写入的适当锁定访问权限。如果需要线程之间的双向通信,还可以为主线程写入的工作线程提供另一个消息队列,并且工作线程将读取该消息队列。

如果您在Visual Studio 2010中运行,它应该始终在调试中工作。但是,由于一个bug,您可能需要禁用然后重新启用“优化”以使发布生效。

我也遇到过类似的情况。带有boost线程的mfc对话框。为了解决这个问题,我向boost线程添加了signals2,并将它们绑定到对话框上的成员函数。当信号进入对话成员函数时,我检查了线程id。如果线程id与对话线程id不同,我将一个boost函数推到函数的std::队列上(相同的签名)。onidle,kickidle我检查队列并执行函数

您正在寻找一个消息队列。当然,如果您在主线程上睡眠,则会阻塞主线程。你还期待什么?睡眠不工作的广告?(也很抱歉,我的意思是a)。我想我还不熟悉的消息队列。。。忘记最后一个问题。我将在消息队列中通知自己…看起来很有希望。但是,如果我理解正确,我应该让我的连接池运行,并让它等待,直到它被请求(例如,获得连接),我应该如何让它等待,一个有互斥锁的等待?我对你的连接池一无所知。增加链接,以提高Asio的样本