2010-08-24 31 views
12

Khi tôi gọi pthread_exit từ main, chương trình không bao giờ bị chấm dứt. Tôi dự kiến ​​chương trình sẽ kết thúc, vì tôi đã thoát khỏi chuỗi chỉ của chương trình, nhưng nó không hoạt động. Có vẻ như treo.Bạn có thể gọi pthread_exit từ chính không?

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

int main(int argc, char *argv[]) 
{ 
    printf("-one-\n"); 

    pthread_exit(NULL); 

    printf("-two-\n"); 
} 

Process Explorer cho thấy (chỉ) chủ đề là trong Wait:DelayExecution nhà nước.

Theo pthread_exit tài liệu:

Quá trình này sẽ thoát ra với một lối ra trạng thái 0 sau khi thread cuối cùng đã bị chấm dứt. Hành vi sẽ là như thể triển khai được gọi là thoát() với đối số bằng không tại thời điểm kết thúc là .

Tôi đang sử dụng Dev-C++ v4.9.9.2pthreads-win32 v2.8.0.0 (liên kết chống lại libpthreadGC2.a).

Thư viện có vẻ là OK (ví dụ: gọi pthread_self hoặc pthread_create từ main hoạt động tốt).

Có lý do nào cho những gì tôi không được gọi là pthread_exit từ main?

+1

Tại sao bạn không 'trả về 0;' thay vì 'pthread_exit (NULL);'? –

+2

Tôi biết tôi _could_ 'return' hoặc' exit'. Tôi chỉ muốn biết nếu nó là hợp pháp để chấm dứt thread chính bằng cách gọi 'pthread_exit'. – user429788

+0

Trả về từ chính() là rất khác nhau để chạy pthread_exit(). Sau đó sẽ cho phần còn lại của chủ đề còn sống để kết thúc và sau đó thoát ra với giá trị trả về 0. Các cựu sẽ chấm dứt tất cả mọi thứ ngay lập tức. –

Trả lời

12

Cũng chắc chắn hợp pháp của nó trong việc triển khai linux của pthreads, xem phần ghi chú trong pthreads_exit. Nó tuyên bố

Để 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).

Hơn nữa, hãy xem mã nguồn here (torwads end) cho thấy nó gần như dịch thành _endthread hoặc _endthreadex. Tài liệu here cho những tài liệu không đề cập đến việc không gọi nó trong chuỗi ban đầu.

+0

Sau đó, tôi đoán nó nên được hợp pháp trong việc thực hiện win32 (http://sourceware.org/pthreads-win32/bugs.html) quá. Tôi đã tìm kiếm một lỗi đã biết giải thích hành vi này, nhưng tôi không thể tìm thấy nó. Theo tôi, đây là một hành vi lỗi hoặc có lý do thực sự tôi không được gọi là 'pthread_exit' trên 'pthreads_win32'. Ai có thể xác nhận bất kỳ giả thuyết nào? – user429788

+0

@matasierra: Tôi đã thêm một số chi tiết hơn vào câu trả lời aboce. Ngoài ra, những gì là chính thực sự thực hiện? – torak

+0

'printf' đầu tiên thực sự được in ra, nhưng cái thứ hai không phải là (như mong đợi). Vấn đề là chương trình sẽ không chấm dứt. Nó đơn giản là loại _frozen_. – user429788

12

Hành vi hoàn toàn hợp pháp và dự định này. Toàn bộ quá trình chỉ kết thúc khi một trong hai chủ đề chấm dứt hoặc exit được gọi một cách rõ ràng hoặc ngầm.

Lợi tức bình thường từ main tương đương với cuộc gọi đến exit. Nếu bạn kết thúc main với pthread_exit, bạn đang nói rõ ràng rằng bạn muốn các chủ đề khác tiếp tục.

0

Khi thử nghiệm trên Linux (CentOS Linux phát hành 7.2.1511 (Core)) Tôi thấy rằng thực sự chương trình chính đang đợi chuỗi "con" tiếp tục. Ngoài ra tôi đã không thể vượt qua ra một mã trở về từ chính, mặc dù nó có thể được xác định như là đối số cho pthread_exit(), như Raul nói ở trên nó luôn luôn trả về với mã exit 0:

retval=3; 
pthread_exit(&retval); 

Chúng tôi cũng quan sát một thông báo lỗi khi sử dụng trình biên dịch Clang (phiên bản 3.4.2) và các tùy chọn vệ sinh:

==5811==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x7f4c090321d0 in thread T0 
#0 0x7f4c08be3e29 in __interceptor_free (/home/karstenburger/tests/libc/pthread_exit_in_main/a+0x65e29) 
#1 0x7f4c08333358 in free_key_mem (/lib64/libdl.so.2+0x1358) 
#2 0x7f4c08745bc1 in __nptl_deallocate_tsd (/lib64/libpthread.so.0+0x7bc1) 
#3 0x7f4c07771b38 in __libc_start_main (/lib64/libc.so.6+0x21b38) 
#4 0x7f4c08bfa08c in _start (/home/karstenburger/tests/libc/pthread_exit_in_main/a+0x7c08c) 

AddressSanitizer can not describe address in more detail (wild memory access suspected). 
SUMMARY: AddressSanitizer: bad-free ??:0 __interceptor_free 
==5811==ABORTING 
Các vấn đề liên quan