天天看点

wxWidgets开发之多线程wxThread编程

上节说到使用wxCondition来实现某一消息处理的业务场景的多线程处理方法。

在此之前先分享一下wxCondition用法。

条件变量,最常用在多线程环境下,用来指示当前所在线程的某些条件已经满足,其他线程可以共享该线程的数据,或者去完成预定的任务。简单的说,就是某一个线程达到了某些条件,告诉其他线程,我已经达到了条件和要求了,然后其他线程就开始做他们的任务了。举个例子:可以使用它来指示一个消息线程已经有数据到来了。

注意:调用 wxCondition::Signal可能发生 在调用wxConditicon::Wait之前,所以为了确保不错过该信号就必须保持与条件初始化相关联的互斥锁,并在调用wxCondition::Signal之前再次上锁保证这段时间内线程同步。

请看以下具体关于使用wxCondition条件变量例子:

class MySignallingThread : public wxThread
{
public:
    MySignallingThread(wxMutex *mutex, wxCondition *condition)
    {
        m_mutex = mutex;
        m_condition = condition;
    }
    virtual ExitCode Entry()
    {
        ... do our job ...
        
        wxMutexLocker lock(*m_mutex);
        m_condition->Broadcast(); //等同于Signal
        return 0;
    }
private:
    wxCondition *m_condition;
    wxMutex *m_mutex;
};
int main()
{
    wxMutex mutex;
    wxCondition condition(mutex);
    
    mutex.Lock();
    
    MySignallingThread *thread = new MySignallingThread(&mutex, &condition);
    thread->Run();
    condition.Wait();
    return 0;
}
           

图中代码意思 启动MySignallingThread线程然后进入线程入口函数Entry,主线程 condition.Wait()意为等待MySignallingThread线程发出信号,主线程才能执行return 0;退出主线程。

这里再说明一点Wait函数可用C++11Lambda匿名表达式,像这样子:condvar.Wait([]{return value == 1;});

拜拜!!!!!!