Poco::Event

Poco::Event是用于多线程之间的同步,其wait调用会阻塞一个线程的执行,当其他线程对此事件set操作后,此线程会继续运行。事件有两种,一种是自动复位,另一种是手动复位。

Event类

Poco::Event_第1张图片

默认构造函数是自动复位,wait用于阻塞一个线程,set后,wait返回;自动复位中,不需要reset。

自动复位状态图

Poco::Event_第2张图片

自动复位中,当多个线程阻塞在同一个Event时,只有一个可以返回,其他的,继续阻塞。

手动复位状态图

Poco::Event_第3张图片

手动复位中,当set了,阻塞于这个Event的所有线程都可以再继续运行,并且可以多次通过这个Event的wait调用。直到reset为止。

demo

#include "Poco/Event.h"
#include "Poco/Thread.h"
using Poco::Event;
using Poco::Thread;

class EventRunnable:public Runnable
{
public:
    EventRunnable(Event& ea,Event& eh):m_EventAuto(ea),m_EventHandle(eh) {  }
    void run()
    {
        std::cout << "Enter Thread." << std::endl;
        m_EventAuto.wait();
        std::cout << "Through wait 1." << std::endl;
        m_EventAuto.wait();
        std::cout << "Through wait 2." << std::endl;
        m_EventHandle.wait();
        m_EventHandle.wait();
        std::cout << "Through wait 3." << std::endl;
    }
private:
    Event& m_EventAuto;
    Event& m_EventHandle;
};

int main()
{
    Event ea;
    Event eh(false);
    EventRunnable r(ea,eh);
    Thread t;
    t.start(r);

    Thread::sleep(200);
    ea.set();
    Thread::sleep(200);
    ea.set();
    Thread::sleep(200);
    eh.set();

    t.join();
    return 0;
}

Poco::Event_第4张图片



你可能感兴趣的:(thread,多线程)