간단한 분리 된 pthread는 취소되지 않습니다! (뮤 테스가있는 경우에도 Cout 블록과 인터리브)
문제
여기에는 어려운 문제가 있습니다. 해결할 수없고 인터넷에서 정답을 찾을 수 없습니다.
정리 라우팅으로 분리 된 스레드를 만들었습니다. 문제는 내 IMAC와 Ubuntu 9.1 (듀얼 코어)에 있다는 것입니다. 경쟁 코드에서 분리 된 스레드를 올바르게 취소 할 수 없습니다.
#include <iostream>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <time.h>
pthread_mutex_t mutex_t;
using namespace std;
static void cleanup(void *arg){
pthread_mutex_lock(&mutex_t);
cout << " doing clean up"<<endl;
pthread_mutex_unlock(&mutex_t);
}
static void *thread(void *aArgument)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
pthread_cleanup_push(&cleanup,NULL);
int n=0;
while(1){
pthread_testcancel();
sched_yield();
n++;
pthread_mutex_lock(&mutex_t);
cout << " Thread 2: "<< n<<endl; // IF I remove this endl; --> IT WORKS!!??
pthread_mutex_unlock(&mutex_t);
}
pthread_cleanup_pop(0);
return NULL;
}
int main()
{
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
int error;
if (pthread_mutex_init(&mutex_t,NULL) != 0) return 1;
if (pthread_create(&thread_id, &attr, &(thread) , NULL) != 0) return 1;
pthread_mutex_lock(&mutex_t);
cout << "waiting 1s for thread...\n" <<endl;
pthread_mutex_unlock(&mutex_t);
int n =0;
while(n<1E3){
pthread_testcancel();
sched_yield();
n++;
pthread_mutex_lock(&mutex_t);
cout << " Thread 1: "<< n<<endl;
pthread_mutex_unlock(&mutex_t);
}
pthread_mutex_lock(&mutex_t);
cout << "canceling thread...\n" <<endl;
pthread_mutex_unlock(&mutex_t);
if (pthread_cancel(thread_id) == 0)
{
//This doesn't wait for the thread to exit
pthread_mutex_lock(&mutex_t);
cout << "detaching thread...\n"<<endl;
pthread_mutex_unlock(&mutex_t);
pthread_detach(thread_id);
while (pthread_kill(thread_id,0)==0)
{
sched_yield();
}
pthread_mutex_lock(&mutex_t);
cout << "thread is canceled";
pthread_mutex_unlock(&mutex_t);
}
pthread_mutex_lock(&mutex_t);
cout << "exit"<<endl;
pthread_mutex_unlock(&mutex_t);
return 0;
}
cout을 printf ()로 바꾸면 끝 "종료"로 작업하지만 Cout (조차도)과 함께 실행 파일이 출력 된 후에 매달립니다.
프로에서 아는 것이 매우 멋질 것입니다. 여기서 문제는 무엇입니까?. Cout이 뮤트에 의해 잠겨있을 때에도 왜 작동하지 않습니까!?
해결책
Probelm은 Cout에 암시 적 취소 지점이 있다는 것에 있습니다!
우리는 다음과 같이 코딩해야합니다.
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_testcancel();
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
처음에 실을 만듭니다.
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
PTHREAD_CANCEL () 만 취소 지점을 갖도록합니다 ...
다른 팁
줄을 댓글을 달아보십시오 pthread_detach(thread_id);
그리고 그것을 실행하십시오. PTHREAD_ATTR_T로 분리 된 스레드를 생성하고 있습니다.
그 중 하나 또는 pthread_create에서 & atts 대신 null을 전달해보십시오 (스레드가 ~ 아니다 분리 된 생성) 및 실행.
타이밍이 옳다면 메인 스레드가 PTHREAD_DETACH를 시도 할 때 (이미 분리 된) 스레드가 사라지고 PTHREAD_DETACH에 결코 착륙하지 않는다고 생각합니다.
편집하다:
Cout이 Gabriel이 지적한 것처럼 암시 적 취소 지점을 가지고 있다면, 아마도 발생하는 일 가능성은 대부분의 일이 뮤트를 잡고있는 동안 스레드가 취소 될 가능성이 높습니다 (cout 후에는 pthreads_unlock_mutex로 만들지 않기 때문에 뮤트에서 기다리는 다른 사람은 영원히 차단됩니다. .
걱정해야 할 유일한 리소스가 뮤트 인 경우, 스레드가 잠긴지 여부를 추적 한 다음 정리에서 동일한 스레드에서 실행된다고 가정 할 때 정리에서 잠금을 해제 할 수 있습니다.
157 페이지를 여기서 살펴보십시오. pthreads 프라이머.