Tôi có nhiều ứng dụng được biên dịch bằng g ++, chạy trong Ubuntu. Tôi đang sử dụng các semaphores có tên để phối hợp giữa các quá trình khác nhau.Làm cách nào để khôi phục một semaphore khi quá trình giảm xuống không bị treo?
Tất cả hoạt động tốt trừ trong tình hình sau: Nếu một trong những quá trình gọi sem_wait()
hoặc sem_timedwait()
để giảm các semaphore và sau đó bị treo hoặc bị giết -9 trước khi nó được một cơ hội để gọi sem_post()
, sau đó từ thời điểm đó trên , semaphore được đặt tên là "không sử dụng được".
Bởi "không sử dụng được", ý tôi là số đếm semaphore giờ là 0, và quá trình cần tăng lên trở lại 1 đã chết hoặc bị giết.
Tôi không thể tìm thấy API sem_*()
có thể cho tôi biết quy trình giảm dần cuối cùng đã bị lỗi.
Tôi có thiếu API ở đâu đó không?
Sau đây là cách tôi mở semaphore tên:
sem_t *sem = sem_open("/testing",
O_CREAT | // create the semaphore if it does not already exist
O_CLOEXEC , // close on execute
S_IRWXU | // permissions: user
S_IRWXG | // permissions: group
S_IRWXO , // permissions: other
1 ); // initial value of the semaphore
Dưới đây là cách tôi giảm nó:
struct timespec timeout = { 0, 0 };
clock_gettime(CLOCK_REALTIME, &timeout);
timeout.tv_sec += 5;
if (sem_timedwait(sem, &timeout))
{
throw "timeout while waiting for semaphore";
}
+1, cuối cùng cũng làm điều tương tự, các ẩn dụ vô dụng trong các tình huống như vậy –
Ai đó đã gửi email cho tôi để hỏi thêm chi tiết. Tôi đã viết một bài đăng blog nhỏ gần 3 năm trước khi tôi gặp phải vấn đề này. Thêm chi tiết về cách tôi giải quyết nó với khóa tập tin có sẵn ở đây: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/index.html –
Điều tương tự có thể đạt được bằng cách mở một đóng một tập tin? Tôi tìm thấy điều này trên trang người đàn ông cho mở(): "Khi mở một tập tin, một khóa với đàn (2) ngữ nghĩa có thể thu được bằng cách thiết lập O_SHLOCK cho một khóa chia sẻ, hoặc O_EXLOCK cho một khóa độc quyền." –