2016-08-05 2 views
0

나는 이와 같이 pthread_t 배열을 가지고있다.C에서 pthread_t 배열을 올바르게 해제하는 방법은 무엇입니까?

pthread_t *workers;   // worker threads running tasks from queue 
workers = malloc(sizeof(pthread_t)*workers_count) 

// then I creates pthread by passing &workers[i] to pthread_create() 

이제 어떻게 해제해야하는지 고려 중입니다. I는 다음과 같이 수행 :

for(int i=0; i<workers_count; i++) 
     free(workers[i]); 
    free(workers); 

을하지만 해제해야합니다 일부 내부 포인터를 포함 할 수있는 구조체가 pthread_t되지 않는 이유는 무엇입니까? 어쩌면 어떤 함수 pthread_destroy (pthread_t *)가 있을까요?

+1

모든 스레드를'pthread_join()'또는'pthread_detach()'해야한다면'pthread_t *'를'free()'할 수 있습니다. – EOF

답변

2

그러나 pthread_t는 해제해야하는 내부 포인터 을 포함 할 수있는 구조체가 아닙니다.

당신은 pthread_t 구조에 포함 된 (또는 심지어 struct의 경우) 또는 구현 방법 무엇에 대해 걱정할 필요가 없습니다. 당신 (수) 만 free() 무엇 당신

어쩌면이 일부 기능 pthread_destroy에게, calloc(), malloc() (가 pthread_t *)를 사용하여 할당?

이러한 기능이 필요하지 않으므로 이러한 기능이 없습니다. 당신이 어떤 목적을 위해 나중에 스레드 ID를 필요로하지 않는

그래서, (는 등, pthread_kill()를 사용하여 신호를 전송, 가입), 당신이 무엇 괜찮습니다. 그렇지 않으면 코드의 적절한 지점에서 (즉, 스레드 ID가 더 이상 필요하지 않을 때) 무료()를해야합니다.


코드에 어떻게 할당했는지 잘 모르겠습니다. 다음은 스레드 ID를 동적으로 할당하는 간단한 예입니다. 위의 예에서

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 

void* doSomeThing(void* arg) 
{ 
    printf("From thread function: Thread ID: %ld\n", (long)pthread_self()); 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    size_t count = 10; 
    pthread_t *tid; 

    tid = malloc(count * sizeof *tid); 

    for(size_t i = 0; i< count; i++) { 
     int rc = pthread_create(&tid[i], NULL, &doSomeThing, NULL); 
     if(rc) { /* failure */ } 
    } 

    for(size_t i = 0;i<count; i++) { 
     pthread_join(tid[i], NULL); 
    } 

    free(tid); 
    return 0; 
} 

, 나는 스레드에 가입 . 결합을 위해 스레드 ID가 필요하기 때문에, tid 이후에 free()가 필요합니다.

또한 tid에 1pthread_t의 블록이 할당 되었기 때문에 free()을 한 번만 호출하는 것을 볼 수 있습니다. 기본적으로, 당신은 malloc() (또는 calloc() 또는 realloc())를 호출 할 때마다 한 번씩 free()를 호출하고 free()에 전달하는 포인터가 이전에 *alloc() 기능 중 하나에 의해 반환 된 같은해야합니다.

+0

괜찮 았어. 그게 무료라고 생각해. (thread_pool-> workers); 루프 추가를위한 추가 기능이있는 경우 충분합니다. SIGABR 예외가 발생합니다. –

+0

@ MichałZiobro 코드에 두 개의 다른 구문이 있습니다. 맨손'workers' 변수, 어떤 경우에는'thread_pool'에서 구조체 멤버 인'workers'로 * 표시됩니다. 그것은 사물을 명확히하는 데 도움이되지 않습니다. 더 적은 것, PP는 절대적으로 여기에서 정확하다 (그리고 확실히 점증 할 가치가있다).'workers' 시퀀스는 오직 동적으로 할당 된 경우에만 (즉, 첫 번째 코드 목록에있는 것처럼 보이고, 두 번째 코드 목록에서는 알 수없는 것처럼) 해방하십시오. 그 전에 모든 스레드를 끝내야한다면, 말하기 전에 모든 스레드를'pthread_join'해야합니다 (joinable이라고 가정). – WhozCraig

+0

예 worker 배열은 thread_pool 구조체 안에 있습니다 만 내부 배열 작업자의 할당 취소는 스레드 풀 구조체가 아닙니다 –

관련 문제