【问题标题】:Have main thread wait for a boost thread complete a task (but not finish)让主线程等待 boost 线程完成任务(但未完成)
【发布时间】:2011-06-05 14:26:22
【问题描述】:

我发现很多关于让一个线程等待另一个线程完成后再继续执行的方法,但这不是我想要做的。我对使用任何多线程 api 都不是很熟悉,但现在我正在尝试学习 boost。我的情况是我正在使用我的主线程(从 int main() 开始)来创建一个负责与主 GUI 交互的类的实例。然后调用一个类函数,该函数创建一个 boost 线程,该线程反过来创建 GUI 并运行消息泵。我想做的是当我的主线程调用类成员函数来创建 GUI 时,我不希望该函数返回,直到我告诉它从新创建的线程中返回。这样,我的主线程无法继续并从 GUI 类调用更多与 GUI 线程交互的函数,直到该线程完成 GUI 创建并进入消息循环。我想我可能能够弄清楚它是否是多个相互交互的提升线程对象,但是当它是与提升线程对象交互的主线程(非提升对象)时,我迷路了。最终,我希望我的主线程中的一个循环调用一个类函数(以及其他任务)来检查用户是否在 GUI 中输入了任何新输入(购买消息循环检测到的任何更改被更新到一个结构并更改一个 bool告诉类函数中的主线程发生了变化)。任何对此的任何建议将不胜感激。

这是主线程调用的成员函数。

int ANNGUI::CreateGUI() { GUIMain = new Main(); GUIThread = new boost::thread(boost::bind(&Main::MainThreadFunc, GUIMain)); 返回0; };

这是boost线程启动函数。

无效的 Main::MainThreadFunc() { ANNVariables = 新的 GUIVariables; WndProc = 新窗口程序; ANNWindowsClass = new WindowsClass(ANNVariables, WndProc); ANNWindow = new MainWindow(ANNVariables); GUIMessagePump = 新消息泵; ANNWindow->ShowWindows(); 而(真) { GUIMessagePump->ProcessMessage(); } };

顺便说一句,一切都编译得很好,当我运行它时,它就可以工作了

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    如果您想等待线程完成,只需使用 join() (http://www.boost.org/doc/libs/1_45_0/doc/html/thread/thread_management.html#thread.thread_management.thread.join)

    如果您正在等待信号,一个简单的解决方案是使用互斥锁。 boost 的屏障互斥锁应该适合你:

    http://www.boost.org/doc/libs/1_45_0/doc/html/thread/synchronization.html#thread.synchronization.barriers

    您可以从增强线程或非增强线程增强互斥锁。

    【讨论】:

      【解决方案2】:

      您可以为此使用condition variable

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 2011-06-02
        • 1970-01-01
        相关资源
        最近更新 更多