使用互斥锁与消息在线程之间共享信息

编辑:我的问题仍然没有答案,如果有人想对它进行拍摄

在我的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

下一篇: Understanding std::atomic::compare