2009-10-22 8 views
19

멀티 스레드를 수행하는 응용 프로그램을 개발 중입니다. 내 작업자 스레드 중 하나가 위젯에 이미지를 표시합니다. 다른 스레드가 사운드를 재생합니다. 단추 클릭 이벤트에서 스레드를 중지/일시 중단/일시 중지하려고합니다. 비디오 플레이어 재생/일시 정지 버튼을 클릭 할 때와 동일합니다. threading을 위해 pthread 라이브러리를 사용하는 Linux 플랫폼에서 C++로 응용 프로그램을 개발 중입니다.리눅스에서 c로 PThread를 잠 그거나 일시 중지하는 방법

누군가 스레드 일시 중지/일시 중지를 어떻게 달성하는지 말해 줄 수 있습니까?

답변

29

뮤텍스, 조건 변수 및 공유 플래그 변수를 사용하여이를 수행 할 수 있습니다. 의 다음을 가정 해 봅시다 전역으로 정의됩니다

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
int play = 0; 

는이처럼 재생 코드를 구성 할 수 :

for(;;) { /* Playback loop */ 
    pthread_mutex_lock(&lock); 
    while(!play) { /* We're paused */ 
     pthread_cond_wait(&cond, &lock); /* Wait for play signal */ 
    } 
    pthread_mutex_unlock(&lock); 
    /* Continue playback */ 
} 

를 그리고, 당신이 할 수있는 재생 :

pthread_mutex_lock(&lock); 
play = 1; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&lock); 

을 그리고 일시 :

pthread_mutex_lock(&lock); 
play = 0; 
pthread_mutex_unlock(&lock); 
+0

다중 스레드 환경에서 전역 공유 변수에 액세스하는 것은 실제로 안전하지 않습니다. '! play'를 검사하기 전에 뮤텍스를 잠그고'play = 0;'을 설정할 때 mutex를 사용하십시오. 실제로 이것은 단일 핵심 시스템에서 문제가되지 않지만 올바른/미래 보장 코드를 작성하는 것이 항상 좋습니다. –

+0

실제로 대부분의 멀티 코어 시스템에서는 문제가되지 않지만, 맞습니다. 최소한 두 가지 메모리 장벽이 필요합니다. 그것들이 없으면 그 일시 정지는 효력을 발생시키기 위해 임의로 오랜 시간이 걸릴 수 있습니다. 물론 뮤텍스를 잠그는 것도 괜찮습니다. 그렇게하기 위해이 대답을 편집 할 것입니다. :) – LnxPrgr3

+0

@deft_code 답변이 업데이트되었습니다! 그래도 내 이전 코멘트를 참조하십시오. – LnxPrgr3

3

주기적으로 UI의 "메시지"에 대한 스레드 폴링이 있습니다. 즉, 한 스레드의 UI는 작업 메시지를 작업자 스레드에 게시합니다. 오디오/비디오.

+2

아마도 여기가 가장 좋은 답변 일 수 있습니다. 문제는 세부 사항에 너무 가늘어서 실제로 질문에 대답하지 않는다는 것입니다. –

관련 문제