2009-04-21 6 views
0
#include <pthread.h> 
static void * worker_thread(void *); 

void some_func(void) 
{ 
    pthread_t * tmp; 
    tmp = malloc(sizeof(pthread_t)); 
    if (NULL != tmp) 
    { 
     if (!pthread_create(tmp, NULL, worker_thread, (void *)tmp)) 
      pthread_detach(*tmp); 
     else 
      free(tmp); 
    } 
} 

static void * worker_thread(void * p) 
{ 
    /* do work */ 
    free(p); 
    return(NULL); 
} 
+3

나는 귀하의 공격적인 공격을 찾습니다. – Randolpho

+0

경쟁 조건이 있습니다. 실제로 스레드를 분리하기 전에 tmp를 해제 할 수 있습니다. 스택 변수를 사용하지 않는 이유는 무엇입니까? –

+0

주의하십시오. 어쨌든 –

답변

2

내가 배운 점은 pthread_t 구조가 스레드 지속 시간 동안 '살아 있어야'하는 것이 아니라는 것입니다. (이것은 내가 생각한 이유이며 왜 malloc을 사용했는지입니다). 스택 변수가 좋다. 내가 한 일은 제이슨 코코의 의견을 바탕으로 한 것입니다.

#include <pthread.h> 

static void * worker_thread(void *); 

void start_worker(void * arg) 
{ 
    pthread_t tmp; 
    (void)pthread_create(& tmp, NULL, worker_thread, arg)) 
} 

static void * worker_thread(void * p) 
{ 
    /* do work */ 

    /* finished work */ 
    pthread_detach(pthread_self()); 
    return (p); 
} 
+2

한 가지 더 -'pthread_create'의 반환 값을 무시하는 것은 나쁜 생각 일 것입니다. 그렇지 않으면 프로그램이 교착 상태에 빠지거나 잘못된 작업을 수행 할 수 있습니다. –

관련 문제