pthread_t
không phải là ID chủ đề hoặc chỉ mục số. Nó là một loại đục. Tạo nên các giá trị có thể dẫn đến sự cố.
Trên Linux NPTL, pthread_t được sử dụng như một con trỏ:
int
__pthread_kill (threadid, signo)
pthread_t threadid;
int signo;
{
struct pthread *pd = (struct pthread *) threadid;
Nó nên được khá rõ ràng nơi mà mọi thứ đang đi sai đã :) Lưu ý rằng pointerness này cũng là một chi tiết thực hiện - thi Linuxthreads cũ sử dụng các chỉ số dạng số vào một bảng và ở đó bạn thực sự có thể tạo ra các TID và không mong đợi mọi thứ bị lỗi.
Bạn cần phải tự theo dõi cuộc sống của luồng và chết. A pthread_t
có hiệu lực cho đến khi bạn gọi thành công pthread_join
. Nếu bạn muốn kiểm tra xem hợp lệpthread_t
có còn hoạt động hay không, hãy gọi pthread_tryjoin_np
trên đó; nếu nó trả về EBUSY
, luồng vẫn còn hoạt động. Nếu hàm thành công, số pthread_t
không còn hợp lệ; bạn không được tái sử dụng nó vào thời điểm này - vì vậy bạn phải ghi chú ở đâu đó rằng chuỗi đó đã chết và không cần kiểm tra nữa!
Bạn có thể, tất nhiên, triển khai hệ thống theo dõi của riêng bạn - tạo bảng ở đâu đó của liveness, một hệ thống để phân phát các TID và chuyển chúng vào các chủ đề mới được tạo. Yêu cầu mỗi chuỗi đánh dấu chính nó là đã chết trước khi thoát (có thể sử dụng pthread_cleanup_push
để bạn xử lý việc hủy chuỗi và pthread_exit
) và tách chủ đề sao cho bạn không cần tham gia nó (sử dụng pthread_detach
). Bây giờ bạn đã kiểm soát rõ ràng báo cáo chuỗi chết của bạn.
Bạn đang sử dụng những giá trị "không hợp lệ" nào? –
@DanFego Ví dụ: 1001 –
Vì pthread_t là một loại mờ, sử dụng số nguyên (như 1001) về lý thuyết có thể gây ra sự cố và sự cố tiếp theo. Bạn có nhận được bất kỳ cảnh báo nào khi biên dịch với -Wall không? –