2011-12-15 25 views
35

Tôi có câu hỏi về lập trình đồng thời C.pthread_join() và pthread_exit()

Trong thư viện pthread, nguyên mẫu của pthread_join

int pthread_join(pthread_t tid, void **ret); 

và nguyên mẫu của pthread_exit là:

void pthread_exit(void *ret); 

Vì vậy, tôi đang bối rối mà, tại sao pthread_join mất giá trị trả về của quá trình dưới dạng con trỏ tới con trỏ void từ chuỗi đã được thu thập, nhưng pthread_exit chỉ lấy con trỏ void từ chuỗi đã thoát? Tôi có nghĩa là về cơ bản họ là tất cả các giá trị trả về từ một sợi, tại sao có một sự khác biệt trong loại?

Trả lời

32

Trong pthread_exit, ret là một tham số đầu vào. Bạn chỉ cần chuyển địa chỉ của một biến cho hàm.

Trong pthread_join, ret là thông số đầu ra. Bạn lấy lại một giá trị từ hàm. Ví dụ, giá trị như vậy có thể được đặt thành NULL.

lời giải thích dài:

Trong pthread_join, bạn lấy lại địa chỉ truyền cho pthread_exit bởi thread đã hoàn thành. Nếu bạn chỉ chuyển một con trỏ đơn giản, nó được truyền theo giá trị, do đó bạn không thể thay đổi vị trí của nó. Để có thể thay đổi giá trị của con trỏ được chuyển tới pthread_join, nó phải được chuyển thành một con trỏ, đó là, một con trỏ trỏ đến một con trỏ.

+0

Nhưng tại sao xác định đặt lại trong 'pthread_exit' một loại' void * ', nó luôn là' NULL' hoặc một số giá trị không đổi khác – stonestrong

3

Việc sử dụng điển hình là

void* ret = NULL; 
pthread_t tid = something; /// change it suitably 
if (pthread_join (tid, &ret)) 
    handle_error(); 
// do something with the return value ret 
25

Nó vì mỗi lần

void pthread_exit(void *ret); 

sẽ được gọi từ chức năng thread vì vậy mà bao giờ bạn muốn quay trở lại chỉ đơn giản là vượt qua con trỏ của nó với pthread_exit().

Bây giờ tại

int pthread_join(pthread_t tid, void **ret); 

sẽ luôn gọi từ nơi chủ đề được tạo ra vì vậy đây phải chấp nhận rằng trở lại con trỏ bạn cần đôi con trỏ ..

tôi nghĩ rằng mã này sẽ giúp bạn hiểu này

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

void* thread_function(void) 
{ 
    char *a = malloc(10); 
    strcpy(a,"hello world"); 
    pthread_exit((void*)a); 
} 
int main() 
{ 
    pthread_t thread_id; 
    char *b; 

    pthread_create (&thread_id, NULL,&thread_function, NULL); 

    pthread_join(thread_id,(void**)&b); //here we are reciving one pointer 
             value so to use that we need double pointer 
    printf("b is %s",b); 
    free(b); // lets free the memory 

} 
+5

rò rỉ bộ nhớ .... – gliderkite

+0

Làm thế nào để giải phóng một trong trường hợp này? Hoặc làm thế nào để tránh rò rỉ bộ nhớ như thế này? – ponypaver

+0

'miễn phí (b);' ngay sau 'printf (" b là% s ", b);' nếu tôi không nhầm. –

Các vấn đề liên quan