2011-08-02 28 views
11

ai đó có thể xin giải thích sự khác biệt là gì nếu tôi làmMutex vs tổ chức sự kiện trong Windows

mutex = createMutex 
waitForSingleObject 
Release(mutex) 

event = createEvent 
waitForSingleObject 
Release(event) 

Tôi rất bối rối, tôi có thể sử dụng cả hai phiên bản dành cho đồng bộ? cảm ơn trước vì bất kỳ trợ giúp nào

Trả lời

12

Bạn sử dụng một mutex để đảm bảo rằng chỉ có một luồng thực thi có thể truy cập vào một thứ gì đó. Ví dụ, nếu bạn muốn cập nhật một danh sách có khả năng có thể được sử dụng bởi nhiều chủ đề, bạn muốn sử dụng một mutex:

acquire mutex 
update list 
release mutex 

Với một mutex, chỉ có một thread tại một thời điểm có thể thực hiện các "danh sách cập nhật ".

Bạn sử dụng sự kiện đặt lại thủ công nếu bạn muốn nhiều chủ đề chờ đợi điều gì đó xảy ra trước khi tiếp tục. Ví dụ: bạn đã bắt đầu nhiều chuỗi, nhưng tất cả chúng đều bị tạm dừng chờ một số sự kiện khác trước khi chúng có thể tiếp tục. Khi sự kiện đó xảy ra, tất cả các chủ đề có thể bắt đầu chạy.

Các chủ đề chính sẽ trông như thế này: Mã

create event, initial value false (not signaled) 
start threads 
do some other initialization 
signal event 

của mỗi chủ đề sẽ là:

do thread initialization 
wait for event to be signaled 
do thread processing 
+0

giá trị ban đầu của mutex: tín hiệu hoặc không được báo hiệu là gì? – yeap

+0

@yeap: Trong hầu hết các trường hợp, bao gồm cả trường hợp này, bạn muốn tạo mutex để ban đầu nó không được mua lại. –

+1

Một khác biệt quan trọng là một mutex có thể bị khóa nhiều lần bởi cùng một luồng (nó là "đệ quy") trong khi một sự kiện có thể được sử dụng để thực hiện khóa không đệ quy. –

1

Có, cả hai có thể được sử dụng để đồng bộ hóa nhưng theo các cách khác nhau.

Mutex là một đối tượng loại trừ lẫn nhau và chỉ có thể được mua bởi một cá thể duy nhất tại một thời điểm. Nó được sử dụng để tránh việc sử dụng đồng thời một tài nguyên chung, chẳng hạn như biến toàn cầu, theo các đoạn mã máy tính

Sự kiện là một vật cản có thể được đặt rõ ràng về trạng thái bằng cách sử dụng hàm SetEvent.

+0

gì Bạn có nghĩa là "của một tine"? sự kiện có thể được mua lại bởi nhiều phiên bản? mutex cũng có thể được báo hiệu nếu tôi waitForSingleObject, tôi có sai không? – yeap

+0

có, cả hai và trong thực tế bất kỳ đối tượng đồng bộ hóa có thể được sử dụng trong WaitForSingleObject/WaitForMultipleObject. Sự khác biệt là trong hành vi của anh ta. – cprogrammer

+0

một Sự kiện không được mua lại như một phần mutex hoặc phần quan trọng được mua lại. Một sự kiện có thể được báo hiệu khi một sự kiện đã xảy ra. – cprogrammer

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