2012-08-09 37 views
15

Tôi gặp sự cố về chủ đề chính và chuỗi khác trong cùng một quy trình. Khi chức năng chính quay trở lại, các thread khác thoát quá? Tôi có một số nhầm lẫn với tôi. Và tôi viết một số mã thử nghiệm, như sau:thoát khỏi chuỗi chính, có thoát khác không?

void* test1(void *arg) 
{ 
    unsigned int i = 0; 
    while (1){ 
     i+=1; 
    } 
    return NULL; 
} 

void* test2(void *arg) 
{ 
    long double i = 1.0; 
    while (1){ 
     i *= 1.1; 
    } 
    return NULL; 
} 

void startThread (void * (*run)(void*), void *arg) { 
    pthread_t t; 
    pthread_attr_t attr; 
    if (pthread_attr_init(&attr) != 0 
     || pthread_create(&t, &attr, run, arg) != 0 
     || pthread_attr_destroy(&attr) != 0 
     || pthread_detach(t) != 0) { 
    printf("Unable to launch a thread\n"); 
    exit(1); 
    } 
} 

int main() 
{ 
    startThread(test1, NULL); 
    startThread(test2, NULL); 

    sleep(4); 
    printf("main thread return.\n"); 

    return 0; 
} 

Khi "trả lại luồng chính". đưa ra, thread test1 và test2 cũng thoát , ai cũng có thể cho tôi biết tại sao?

+0

Văn bản của câu hỏi không khớp với nội dung câu hỏi. Đây có phải là điều gì xảy ra khi luồng chính thoát ra không? Hay đây là điều gì xảy ra khi luồng chính trả về từ hàm 'main'? (Rõ ràng, các chủ đề không thể trở lại nếu nó thoát. Nó có thể làm một hay khác.) –

Trả lời

9

Khi chuỗi chính trả về, nó sẽ kết thúc toàn bộ quá trình. Điều này bao gồm tất cả các chủ đề khác. Điều tương tự cũng xảy ra khi bạn gọi exit.

Mục đích của pthread_detach là để làm cho nó, do đó bạn không cần phải tham gia với các chủ đề khác để phát hành tài nguyên của họ. Tách một sợi không làm cho nó tồn tại quá trình chấm dứt quá trình, nó sẽ vẫn bị phá hủy cùng với tất cả các chủ đề khác.

+16

Câu trả lời này được viết là không đúng sự thật. Khi luồng chính (hoặc bất kỳ chuỗi nào) gọi 'thoát', hoặc khi lời gọi ban đầu của' main' trả về, toàn bộ quá trình sẽ thoát. Nhưng luồng chính có thể thoát bằng 'pthread_exit' mà không ảnh hưởng đến các luồng khác. –

19

Bạn nên sử dụng pthread_join() trên mỗi chủ đề mới, để thông báo cho chuỗi cuộc gọi đang chờ trên tiểu chủ đề, tạm ngừng thực thi - và thoát khỏi quá trình - cho đến khi các chuỗi đó chấm dứt.

Gọi pthread_detach trên các chủ đề đã tạo sẽ không giữ chúng xung quanh sau khi thoát khỏi quá trình. Từ linux man page:

Thuộc tính tách riêng chỉ xác định hành vi của hệ thống khi chuỗi kết thúc; nó không ngăn chặn các thread bị chấm dứt nếu quá trình chấm dứt bằng cách sử dụng exit (3) (hoặc tương đương, nếu thread chính trả về).

Bạn đôi khi sẽ thấy một pthread_exit trong main sử dụng thay cho rõ ràng pthread_join cuộc gọi, mục đích được rằng thoát main theo cách này sẽ cho phép chủ đề khác để tiếp tục chạy. Trên thực tế, số linux man page nêu rõ điều này:

Để cho phép các chủ đề khác tiếp tục thực hiện, chủ đề chính phải chấm dứt bằng cách gọi pthread_exit() thay vì thoát (3).

Nhưng tôi không biết đây có phải là hành vi được mong đợi trên tất cả các nền tảng hay không và tôi luôn bị mắc kẹt khi sử dụng pthread_join.

pthread_join yêu cầu pthread_t cho chuỗi đích, vì vậy mã của bạn sẽ cần thay đổi một chút vì bạn cần tạo cả hai chủ đề trước khi gọi pthread_join để đợi cả hai. Vì vậy, bạn không thể gọi nó trong startThread. Bạn sẽ cần phải trả lại số pthread_t hoặc chuyển con trỏ đến pthread_t tới hàm startThread của bạn.

+1

Nhưng tôi sử dụng chức năng pthread_detach, để tránh điều này. – laifjei

+2

Đọc kỹ tài liệu cho ['pthread_detach'] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html) một cách cẩn thận. Nó không làm những gì bạn nghĩ. – pb2q

+0

@laifjei Có thể bạn đang nhầm lẫn với chức năng được cung cấp e. g. trong Java/C#/Python/v.v. - chủ đề daemon. Java trong nội bộ giữ cho quá trình còn sống trong khi bất kỳ chủ đề không phải daemon nào còn sống (mặc dù thread chính chết). –

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