2011-02-19 2 views

답변

15

이벤트 루프의 경우 boost :: asio :: io_service를 사용하십시오. 이 객체 내부에 작업을 게시하고 다른 스레드에서 스레드를 안전하게 실행할 수 있습니다.

struct MyClass 
{ 
    boost::io_service service; 
    void doSomethingOp() const { ... } 

    void doSomething() 
    { 
     service.post(boost::bind(&MyClass::doSomethingOp, this)); 
    } 

    void loop() 
    { 
      service.run(); // processes the tasks 
    } 
}; 

boost::signal<void()> mySignal; 

MyClass myClass; 
mySignal.connect(boost::bind(&MyClass::doSomething, boost::ref(myClass))); 

// launches a thread and executes myClass.loop() there 
boost::thread t(boost::bind(&MyClass::loop(), boost::ref(myClass))); 

// calls myClass.doSomething() in this thread, but loop() executes it in the other 
mySignal(); 
+2

THX이 매우 유용한 샘플입니다. boost :: signal은 deprecated이므로 boost :: signals2 :: signal <>을 사용해야합니다. – synapse

2

부스트가 이벤트 루프를 제공하지 않기 때문에 직접적으로 발생하지 않습니다.

신호를 다른 스레드에서 처리하게하려면 다른 스레드가 핸들러를 실행하고 실행해야하는 큐를 검사해야합니다 (일반적으로 일종의 이벤트 루프를 의미 함). Boost는 하나를 제공하지 않으므로 다른 곳에서 가져 오거나 작성해야합니다.

이벤트 루프가 신호를 제공하지 않는 경우 (또는 대기열을 사용하는 간단한 솔루션을 구현하는 경우) boost.signals2를 사용할 수 있어야합니다 (boost.signals가 아님). 스레드 안전) operator+=을 재정 의하여 각 처리기를 다른 스레드로 래핑하여 다른 스레드에서 실행되도록 대기시킵니다. 반환 값 (Qt에서 지원되지 않지만 boost에 의해 지원되는)을 가진 시그널을 위해 시그널을 구현할 수도 있지만 데드 록을 피하기 위해서는 조심해야한다.

관련 문제