2009-07-09 21 views
8

Với pthread_cond_t chúng ta phải kết hợp một mutex, Khi tín hiệu tình trạng này tôi đã nhìn thấy nhưgọi pthread_cond_broadcast với mutex được tổ chức hay không? đang

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_cond_broadcast(&cond); 
pthread_mutex_unlock(&mutex); 

pthread_mutex_lock(&mutex); 

//code that makes condition true 

pthread_mutex_unlock(&mutex); 
pthread_cond_broadcast(&cond); 

Đó là một trong những cách thích hợp? (Có quan trọng không?)

Trả lời

13

Phụ thuộc vào bồn rửa đang làm gì (và bất kỳ nguồn nào khác).

Trong mẫu mã thứ hai của bạn, có thể ở giữa mở khóa và phát sóng, một loạt các chủ đề khác sẽ đến và làm một số kết hợp của những thứ làm cho điều kiện sai một lần nữa. Sau đó bạn sẽ phát sóng vô nghĩa. Và bạn sẽ không nhất thiết phải có cùng một bộ bồi bàn như ở đó khi bạn thay đổi điều kiện, điều này có thể hoặc không ảnh hưởng đến thiết kế của bạn.

Một bồn rửa tốt không nên quan tâm nếu nó bị đánh thức và điều kiện là sai, đặc biệt nếu bạn đang sử dụng chương trình phát sóng. Miễn là mọi thay đổi của điều kiện thành "true" cuối cùng được theo sau bởi một phát sóng, tôi khá chắc chắn rằng với bồn rửa thích hợp bằng văn bản, bạn có thể phát một biến điều kiện willy-nilly có hoặc không có khóa.

Vì vậy, tôi không nghĩ rằng nó thực sự quan trọng, nhưng cá nhân tôi muốn phát sóng với khóa được tổ chức, nếu chỉ để tránh phải lo lắng về nó. "Thay đổi và tín hiệu nguyên tử" có thể đơn giản hóa sơ đồ trạng thái trên bảng trắng của bạn so với "thay đổi ... một thời gian sau đó, tín hiệu".

Cả hai đều phù hợp (không phải chờ đợi mà không có mutex, không được phép), nhưng tôi không nghĩ sẽ quá khó để đưa ra các công dụng có thể sai trong trường hợp thứ hai, điều đó sẽ không đi sai trong lần đầu tiên. Họ có lẽ phải liên quan đến một số bồi bàn làm những điều hơi bất thường, mặc dù.

Thông số kỹ thuật nói một cách khó hiểu là "nếu hành vi lập lịch có thể dự đoán được yêu cầu, thì mutex đó sẽ bị khóa bởi chuỗi gọi pthread_cond_broadcast() hoặc pthread_cond_signal()."

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_signal.html

+0

Có cùng câu hỏi tôi đã tìm thấy câu trả lời của bạn. Tôi đã theo liên kết của bạn và tôi nghĩ rằng anh ta bit rằng bạn trích dẫn có liên quan đến bit trước đó: "Nếu nhiều hơn một thread bị chặn trên một biến điều kiện, chính sách lập lịch sẽ xác định thứ tự trong đó chủ đề được bỏ chặn." – wilx

+0

@wilx: vâng, mối quan tâm của tôi là những gì được cho phép bởi "hành vi lập kế hoạch không thể đoán trước". Ví dụ, giả sử bạn có một bộ lập lịch được ghi lại, hoặc có một tùy chọn, các biến điều kiện và biến mutexes sẽ chọn thread để đánh thức trên cơ sở FIFO. Câu "khó hiểu" ngụ ý rằng hành vi không được mong đợi là FIFO nếu người gọi 'pthread_cond_signal' không giữ mutex? Tôi sẽ nghĩ như vậy, nhưng tôi không biết định nghĩa chính thức của "có thể đoán trước", vì vậy đó là lý do tại sao tôi thấy nó khó hiểu. Ngoại trừ trong hệ thống RT, tôi luôn coi việc lên lịch là một chút không thể đoán trước, nhưng tôi không muốn nó trở nên kỳ lạ. –

+0

Không có trường hợp nào được biết đến khi phát sóng trước hoặc sau khi mở khóa. Với khó khăn lớn, người ta có thể xây dựng mã mà phá vỡ nếu bạn di chuyển một tín hiệu đến sau khi mở khóa. –

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