2010-03-27 30 views
15

Đây là cách thông thường để sử dụng một biến trạng:Biến điều kiện vẫn cần một mutex nếu bạn thay đổi giá trị được kiểm tra một cách nguyên tử?

// The reader(s) 
lock(some_mutex); 
if(protected_by_mutex_var != desired_value) 
    some_condition.wait(some_mutex); 
unlock(some_mutex); 

// The writer 
lock(some_mutex); 
protected_by_mutex_var = desired_value; 
unlock(some_mutex); 
some_condition.notify_all(); 

Nhưng nếu protected_by_mutex_var được thiết lập nguyên tử bằng cách nói rằng, một hướng dẫn so sánh-và-swap, không mutex phục vụ bất cứ mục đích (trừ rằng pthreads và khác API yêu cầu bạn vượt qua trong một mutex)? Là nó bảo vệ nhà nước được sử dụng để thực hiện các điều kiện? Nếu không, có an toàn không khi thực hiện việc này ?:

// The writer 
atomic_set(protected_by_mutex_var, desired_value); 
some_condition.notify_all(); 

Với tác giả không bao giờ tương tác trực tiếp với trình đọc của mutex? Lưu ý rằng tên 'protected_by_mutex_var' không còn thực sự thích hợp nữa (nó không còn được bảo vệ bằng mutex nữa). Nếu vậy, có cần thiết là những độc giả khác nhau sử dụng cùng một mutex không?

+1

Toàn bộ vấn đề của các biến điều kiện là họ làm cho "kiểm tra ngữ, mở khóa mutex, và ngủ "nguyên tử. –

Trả lời

14

Hãy tưởng tượng kịch bản sau đây:

| Thread 1           | Thread 2           | 
| if(protected_by_mutex_var != desired_value) -> true |             | 
|              | atomic_set(protected_by_mutex_var, desired_value); | 
|              | some_condition.notify_all();      | 
| some_condition.wait(some_mutex);     |             | 

Tình trạng này thấy Chủ đề 1 chờ đợi một thông báo rằng có thể không bao giờ đến. Bởi vì các câu lệnh hoạt động trên điều kiện không phải là một phần của biến đọc/bộ nguyên tử, điều này thể hiện một điều kiện chủng tộc.

Sử dụng mutex có hiệu quả làm cho những hành động không thể tách rời (giả sử tất cả các truy cập vào biến cư xử đúng và khóa mutex.)

+0

Tất nhiên: p Chờ đợi trên các điều kiện không hoạt động như poll(). –

+0

* "Bởi vì các câu lệnh hành động trên điều kiện không phải là một phần của biến đọc/bộ nguyên tử, điều này thể hiện một điều kiện chủng tộc." * Bạn sẽ giải thích chi tiết một lần nữa chi tiết xin vui lòng? –

+0

@Anisha Kaul: Hãy xem xét mã người đọc ngay bây giờ. Trong trường hợp này, câu lệnh hành động trên điều kiện là "some_condition.wait (some_mutex)", và biến đọc đang diễn ra trong "if (protected_by_mutex_var! = Desired_value)". Tất cả những gì tôi đang cố gắng nói là không có gì đảm bảo rằng một luồng khác sẽ không làm gián đoạn giữa hai hoạt động này - chúng không phải là "cùng nhau"/"nguyên tử"; hoặc khi tôi đặt nó trước, sự chờ đợi không phải là "một phần của" biến đọc. Tương tự như vậy đối với chuỗi ghi, cho cuộc gọi atomic_set và lệnh some_condition.notify_all(). –

Các vấn đề liên quan