使用互斥锁与消息在线程之间共享信息
编辑:我的问题仍然没有答案,如果有人想对它进行拍摄
在我的MFC C ++应用程序中,我在GUI线程和工作线程之间共享信息,如以下代码所示。 我创建了一个名为inParams的结构,它需要在主线程和工作线程中引用。 因此,我声明了std :: atomic类型的成员,并且在原子类型不存在的情况下,例如。 对于花车,我使用专用的互斥体。 主线程使用此信息执行Foo操作,并且工作线程执行操作栏。 Foo和Bar同时运行,两者都可以看到对用户更新的参数1和参数2的更改。
struct inParams{
std::atomic_int param1;
std::atomic_size_t param2;
std::vector<customType> giantData;
std::mutex giantDataMutex;
};
void myController::DoMainTask(){
// Keep Handling GUI Events in this thread (main thread)
// Create a Worker thread to do another task, I'll call it Bar
SpawnWorkerThread()
}
void myController::SpawnWorkerThread(){
std::thread t(&myController::tfunc, this);
t.detach();
}
void myController::OnTimer(){ // say every 50 ms, just to simulate concurrency
// When user changes param1 or param2, the changes affect here also
Foo(inParams.param1, inParams.param2/* .. params list .. */);
}
void myController::tfunc(){
while(1){
// When user changes param1 or param2, the changes affect here also
Bar(inParams.param1, inParams.param2, /* .. params list .. */); //
}
}
void myController::OnEventParam1(){ // User changed param1 in GUI
inParams.param1 = GetValue( param1EditBox ); // GetValue gets value from Edit Box
}
void myController::OnEventParams2(){ // User changed param2 in GUI
inParams.param2 = GetValue( param2EditBox );
}
我的问题是这个 - 这是一个AntiPattern吗? 我应该使用消息来分享这些信息,而不是使用互斥体共享参数(通过使它们成为原子)?
C ++ 11 std :: threads是否允许消息传递,还是应该依赖WinAPI中的PostThreadMessage API?
您正在使用轮询/计时器轮询共享变量。 使用消息(PostMessage和PostThreadMessage)的优点是它消除了轮询,并让线程成为事件驱动。 无论您是传递消息中的数据还是使用您拥有的同步访问权限,都无关紧要。 无论哪种方式都很好,但投票是不好的。
链接地址: http://www.djcxy.com/p/78219.html上一篇: Sharing information between threads using mutex vs messages