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

时间:2014-11-07 21:12:13

标签: c++ multithreading c++11 concurrency mfc

编辑:我的问题仍然是未答复,如果有人想要拍摄它

在我的MFC C ++应用程序中,我在GUI线程和工作线程之间共享信息,如以下代码所示。我创建了一个名为inParams的结构,需要在主线程和工作线程中引用它。因此,我声明它的成员是std :: atomic类型,并且在原子类型不存在的情况下,例如。对于花车,我使用专用的互斥锁。主线程使用此信息操作 Foo ,工作线程执行操作 Bar Foo和Bar并发运行,两者都可以看到param1和param2在用户更新时的变化。

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?

1 个答案:

答案 0 :(得分:0)

您正在使用轮询/计时器轮询共享变量。使用消息(PostMessage和PostThreadMessage)的优点是它消除了轮询并让线程成为事件驱动的。您是否在邮件中传递数据或使用您拥有的同步访问权限并不重要。无论哪种方式都很好,但民意调查很糟糕。