Cách rõ ràng để biết liệu một chuỗi có được thực hiện hay không là gọi số pthread_join()
với chuỗi đó.
// int pthread_join(pthread_t thread, void **retval);
int retval = 0;
int r = pthread_join(that_thread_id, &retval);
... here you know that_thread_id returned ...
Vấn đề với pthread_join()
là, nếu luồng không bao giờ trả về (tiếp tục chạy như mong đợi) thì bạn bị chặn. Do đó, không phải là rất hữu ích trong trường hợp của bạn.
Tuy nhiên, bạn thực sự có thể kiểm tra xem bạn có thể tham gia (tryjoin) như sau:
//int pthread_tryjoin_np(pthread_t thread, void **retval);
int retval = 0;
int r = pthread_tryjoin_np(that_thread_id, &relval);
// here 'r' tells you whether the thread returned (joined) or not.
if(r == 0)
{
// that_thread_id is done, create new thread here
...
}
else if(errno != EBUSY)
{
// react to "weird" errors... (maybe a perror() at least?)
}
// else -- thread is still running
Ngoài ra còn có một theo thời gian tham gia mà sẽ chờ đợi cho số lượng thời gian mà bạn chỉ định, giống như một vài giây. Tùy thuộc vào số lượng các chủ đề để kiểm tra và nếu quá trình chính của bạn chỉ ngồi xung quanh khác, nó có thể là một giải pháp. Chặn trên luồng 1 trong 5 giây, sau đó là chuỗi 2 trong 5 giây, v.v ... sẽ là 5.000 giây trên mỗi vòng lặp cho 1000 luồng (khoảng 85 phút để đi xung quanh tất cả các chuỗi với thời gian cần thiết để quản lý mọi thứ ...)
Có một mã mẫu trong trang hướng dẫn sử dụng hàm pthread_timedjoin_np(). Tất cả bạn sẽ phải làm là đặt một vòng lặp xung quanh để kiểm tra từng chủ đề của bạn.
struct timespec ts;
int s;
...
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
/* Handle error */
}
ts.tv_sec += 5;
s = pthread_timedjoin_np(thread, NULL, &ts);
if (s != 0) {
/* Handle error */
}
Nếu quá trình chính của bạn có những việc khác cần làm, tôi khuyên bạn không nên sử dụng phiên bản hẹn giờ và chỉ lướt qua tất cả các chủ đề nhanh nhất có thể.
Tôi tò mò muốn biết nếu có thể được phát hiện mà không có một chủ đề watchdog, nhưng tôi khá chắc chắn bạn phải rời khỏi "giải trí của chủ đề chết" để một người quản lý thread bên ngoài xử lý tín hiệu. (Nhưng tôi đã không bao giờ thực sự cố gắng để làm một điều như vậy, vì vậy tôi có thể sai) – Shahbaz
Tôi tò mò muốn biết những gì bạn có nghĩa là do "chấm dứt do một số lỗi". Nếu một thread ngăn chặn toàn bộ quá trình cùng với tất cả các chủ đề khác segfaults. – alk
im làm việc trên máy chủ web đa luồng, khi số lượng chuỗi ít hơn số cố định, máy chủ chấm dứt. Tôi không biết tại sao các chủ đề đang được chấm dứt trong chương trình, máy chủ phục vụ khoảng 1000 kết nối, sau đó nó chấm dứt. – CodeRed