2011-01-23 35 views
5

POSIX's mutex tương đương với Win32's CRITICAL_SECTION - phạm vi của nó được giới hạn trong một quy trình duy nhất. Win32 của mutex (Trên thực tế được gọi là một "đột biến" trong đất NT) phục vụ như là một cơ chế khóa quá trình chéo. Tương đương pthreads 'cho khóa chéo quá trình là gì?Tương đương với POS32 của WinIX là gì?

+0

'CRITICAL_SECTION' gần hơn với' pthread_spinlock_t', mutex sẽ là 'WaitForSingleObject' /' ReleaseMutex' so với 'pthread_mutex_t'. –

+0

@ Steve-o: Sự khác nhau giữa hai điều đó là gì? Theo sự hiểu biết của tôi (mặc dù có giới hạn), sự khác biệt duy nhất giữa một phần quan trọng và một mutex là một trong số đó nằm trong một tiến trình duy nhất, trong khi quy trình kia là cross-process. Vậy thì sự khác biệt giữa spinlock posix và mutix posix là gì? –

+0

@Billy: Câu trả lời này có thể giúp, các vòng xoay bận rộn chờ đợi, hiệu suất mutexes http://stackoverflow.com/questions/195853/spinlock-versus-semaphore –

Trả lời

6

Đó là một pthread_mutex_t với một thuộc tính pshared thiết lập để PTHREAD_PROCESS_SHARED. Tuy nhiên, bạn chịu trách nhiệm đặt một mutex như vậy trong bộ nhớ chia sẻ, rằng tất cả các quy trình có thể truy cập - vì vậy nó không đơn giản như win32 api.

Có lẽ gần hơn với win32 là posix hoặc sysv semaphore. Theo truyền thống, đồng bộ hóa giữa các quy trình cũng đã được thực hiện bằng cách sử dụng khóa tệp, ví dụ: bầy hoặc lockf (điều này không hề chậm đến mức có thể)

+0

Phạm vi không chỉ áp dụng cho chủ đề? Bạn chỉ có thể chuyển 'pthread_attr_t' sang' pthread_create'. Bạn cần sử dụng 'pthread_mutexattr_t' với' pthread_mutex_init'. –

+0

Bạn nói đúng, đó là sự chia sẻ của pthread_mutexattr bạn sẽ cần – nos

+0

Bạn có một liên kết về sự chậm trễ (hoặc thiếu nó) của ổ khóa? Tôi đã tìm kiếm thêm chi tiết về điều đó nhưng không tìm thấy điều gì thú vị. Chúng tôi có một dự án lớn với các tệp được chia sẻ lớn và tôi nghi ngờ chúng tôi có một số vấn đề về hiệu suất vì các khóa, nhưng tôi không biết làm thế nào để tìm hiểu. –

0

Bạn nên sử dụng IPC cho các thao tác xử lý chéo: đường ống, semaphores, hàng đợi tin nhắn hoặc bộ nhớ dùng chung. Tôi nghĩ rằng trong trường hợp của bạn có tên là semaphores sẽ là tốt. Để biết thêm thông tin:

man 7 sem_overview 
+0

Tôi muốn sử dụng bộ nhớ dùng chung. Nhưng vẫn cần phải có một cách để thực hiện khóa trên bộ nhớ chia sẻ đó. –

+0

sem_init() có thể được sử dụng để thực hiện khóa trên bộ nhớ dùng chung. –

+0

Hãy quên đi công cụ semaphore vô ích này. Tạo một đối tượng bộ nhớ chia sẻ và sau đó tạo ra một mutex chia sẻ trong nó. –

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