간단한 분리 된 pthread는 취소되지 않습니다! (뮤 테스가있는 경우에도 Cout 블록과 인터리브)

StackOverflow https://stackoverflow.com/questions/2440576

  •  19-09-2019
  •  | 
  •  

문제

여기에는 어려운 문제가 있습니다. 해결할 수없고 인터넷에서 정답을 찾을 수 없습니다.

정리 라우팅으로 분리 된 스레드를 만들었습니다. 문제는 내 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 프라이머.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top