我发现有很多让一个线程等待另一个线程在继续之前完成执行,但这不是我想要做的。我对使用任何多线程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。
答案 0 :(得分:5)
如果您想等待线程完成,只需使用join()(http://www.boost.org/doc/libs/1_45_0/doc/html/thread/thread_management.html#thread.thread_management.thread.join)
如果您正在等待信号,一个简单的解决方案就是使用互斥锁。 boost的屏障互斥量应该对你有用:
您可以从boost线程或非boost线程中提升互斥锁。
答案 1 :(得分:1)
您可以使用condition variable。