主线程等待提升线程完成任务(但没有完成)

时间:2011-01-07 23:39:56

标签: c++ multithreading boost

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

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

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

这是提升线程启动功能。

void Main::MainThreadFunc()
{
    ANNVariables = new GUIVariables;
    WndProc = new WindowProcedure;
    ANNWindowsClass = new WindowsClass(ANNVariables, WndProc);
    ANNWindow = new MainWindow(ANNVariables);
    GUIMessagePump = new MessagePump;
    ANNWindow->ShowWindows();
    while(true)
    {
        GUIMessagePump->ProcessMessage();
    }
};
顺便说一句,所有内容编译都很好,当我运行它时,它只是在主线程中放入一个sleep(),所以我可以稍微使用GUI。

2 个答案:

答案 0 :(得分:5)

如果您想等待线程完成,只需使用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

您可以从boost线程或非boost线程中提升互斥锁。

答案 1 :(得分:1)

您可以使用condition variable