Tôi đang sử dụng ngôn ngữ c để xử lý đồng thời và tôi có một nhóm quy trình. Để làm điều này, tôi đặt mỗi phần tử con trong một vòng lặp While (True). Để giết đứa trẻ, tôi sử dụng một biến toàn cục và một bộ xử lý tín hiệu để sửa đổi nó nhằm phá vỡ vòng lặp.
Vấn đề là trẻ em sử dụng bộ nhớ được cấp phát và tôi muốn giải phóng nó. Vì vậy, sử dụng SIGTERM đơn giản từ cấp độ gốc sẽ không hiệu quả.
Tổng thể:
int sigusr1_count = 0;
void SenalTerminacion() {
++sigusr1_count;
}
tín hiệu(SIGUSR1, SenalTerminacion);
đứa trẻ :
Trong khi (1) {
if (sigusr1_count != 0) {
phá vỡ;
}
/*một số phép tính*/
}
print("Tràn ngăn xếp Hola\n");
/*giải phóng bộ nhớ*/
thoát (0);
Bố:
kill(pidChild, SIGUSR1);
chờ đợi(NULL);
Nếu tôi nhận xét dòng chờ đợi, mã sẽ hoạt động và hiển thị thông báo. Nhưng nếu tôi để lại thì chương trình sẽ bị treo. Tôi có thể tưởng tượng nếu đứa trẻ không đến vì một số điều kỳ lạ mà tôi không biết về tín hiệu và chờ đợi. Tôi có n đứa con. Cảm ơn bạn trước!
sigusr1_count có thể được lưu vào bộ đệm bởi tiến trình con/cha của bạn (trong tệp đăng ký - trình biên dịch thực hiện việc này) thay vì đọc từ bộ nhớ (hoặc được biên dịch đầy đủ không thay đổi trong tiến trình con). Đánh dấu nó dễ bay hơi để ngăn chặn cả hai:
dễ bay hơi int sigusr1_count=0;
Tốt hơn: Hãy cân nhắc sử dụng các ẩn dụ để báo hiệu giữa các quá trình thay vì các vòng lặp while(1) bận rộn.
Tôi là một lập trình viên xuất sắc, rất giỏi!