Tôi đang viết một chương trình, với một chuỗi chủ và một số chuỗi công việc, và tôi muốn nhận được quyền xử lý tín hiệu. Vấn đề của tôi là như sau:luồng chủ/công nhân và xử lý tín hiệu
bắt đầu Thầy chủ đề và làm tất cả việc phân bổ
Thạc sĩ đề đặt ra một xử lý tín hiệu SIGINT
đề Thạc sĩ bắt đầu đề người lao động. công nhân chủ đề không cần dọn dẹp đặc biệt, tuy nhiên họ có thể ngủ trên hệ thống gọi hoặc semaphore.
Khi nhận được SIGINT, sự hiểu biết của tôi là chỉ có một luồng nhận được. Vì vậy, nếu thread đang ngủ trên hệ thống gọi hoặc semaphore, họ sẽ không được waked lên, và tôi sẽ không thể pthread_join chủ đề công nhân của tôi và làm tất cả các dọn dẹp cần thiết trong chủ đề của tôi.
Trình xử lý tín hiệu sau có thể giải quyết được sự cố của tôi không?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
Những gì tôi mong đợi là khi nhận SIGINT, tất cả các chủ đề sẽ được báo hiệu bằng tín hiệu khác, thoát khỏi cuộc gọi chặn của họ, xem g_do_cleanup
cờ và thoát một cách duyên dáng.
Bất kỳ nhận xét hoặc liên kết nào về cách thực hiện việc này đều được hoan nghênh.
Chỉnh sửa: Tôi không tìm cách đánh thức nhiều chuỗi đang đợi trên một điều kiện cụ thể, vì vậy tôi không nghĩ rằng phương pháp pthread_cond_signal là những gì tôi đang tìm kiếm. Những gì tôi muốn là:
- Tìm một cách mà tất cả các chủ đề đó là chặn trên một cuộc gọi chặn trả từ các cuộc gọi.
- Hoặc tiêu diệt tất cả các chủ đề ngoại trừ chủ đề chính.
Vâng.Hầu hết mọi người sử dụng pthread hoặc Win32/MFC triển khai để làm chủ đề – Kieveli
Không, tôi không nghĩ rằng nó là ok, bởi vì nó sẽ không đánh thức tôi dậy từ một cuộc gọi chọn chặn, hoặc một cuộc gọi sem_wait. Có lẽ tôi có thể thay thế các semaphores bằng một pthread_condition, nhưng sự trừu tượng semaphore thực sự phù hợp với mô hình đồng bộ hóa của tôi. – shodanex