2015-01-05 2 views
-1

부스트 간 스레드 통신을 구현해야합니다. 다음 코드를 고려하십시오.부스트 인터 스레드 통신

#include <boost/thread/thread.hpp> 
#include <Windows.h> 
void threadA() 
{ 
    while(true) 
    { 
     std::cout << "From thread A" << std::endl; 
     Sleep(3000); //pretend to do the work 
    } 
} 

void threadB() 
{ 
    while(true) 
    { 
     std::cout << "From thread B" << std::endl; 
     Sleep(3000); //pretend to do the work 
    } 
} 

int main() 
{ 
    boost::thread *th1 = new boost::thread(&threadA); 
    boost::thread *th2 = new boost::thread(&threadB); 
    th1->join(); 
    th2->join(); 
    delete th1; 
    delete th2; 
} 

위의 코드를 실행하면 두 스레드가 모두 생성됩니다. 내가하고 싶은 일은 threadA을 시작하고 메시지를 threadB에게 보내면받는 즉시 스레드가 시작됩니다. 또는 더 일반적으로,이 두 스레드가 독립적으로 실행되는 경우 어떻게 통신을 처리 할 수 ​​있습니까?

답변

4

여러 가지가 있습니다.

  • 사용 조건 변수 (일명. 이벤트)

부스트의 구현을 제공 세마포어

  • 사용 lockfree 동시 데이터 구조,보다 일반적으로 동시 큐 (메시지 등)를 사용하거나 무엇보다도.

  • +0

    한 가지 방법은 전역 변수를 구현하고 스레드에서 검사하는 것입니다. 기존 코드에서 세마포, lockfree 큐를 어떻게 사용할 수 있습니까? – Pant

    +0

    어떤 방법 으로든 다른 언어/플랫폼에서 사용할 수 있습니다. 그것들은 실제로 언어에 구애받지 않는 개념입니다. 일부 문서 (http://www.boost.org/doc/libs/1_57_0/doc/html/lockfree.html 또는 http://www.boost.org/doc/libs/1_57_0/doc/html/)를 읽으십시오. thread/synchronization.html # thread.synchronization.condvar_ref). 그리고 lockfree 큐를 세마포어와 결합하면 의미가 없습니다. – sehe

    +0

    '전역 변수를 구현하고 대다수의 목적을 위해 쓰레드를 검사합니다. 이러한 통신에는 드문 경우가 있습니다 (예 : 모든 스레드가 가끔씩 확인하기 위해 원자적인 'AppClosing = true'이지만, 폴링이 CPU, 메모리 대역폭 및 에너지 낭비 인 일반 스레드 간 통신 (예 : 사무실이 실제로 춥지 않는 한)에 대해서는 절망적입니다. –