2011-01-23 24 views
5

POSIX'in mutex, Win32'un CRITICAL_SECTION ile eşdeğerdir - kapsamı tek bir işlemle sınırlıdır. Win32'un mutex (Aslında NT arazisinde "mutant" olarak adlandırılır) çapraz süreç kilitleme mekanizması olarak hizmet eder. Çapraz süreç kilitleri için pthreads 'eşdeğeri nedir?POSIX'in Win32's Mutex'ine eşdeğer nedir?

+0

'CRITICAL_SECTION' pthread_spinlock_t''ye daha yakın, mutex' WaitForSingleObject'/'ReleaseMutex' vs.' pthread_mutex_t' olacaktır. –

+0

@ Steve-o: Bu ikisi arasındaki fark nedir? Benim (sınırlı da olsa) benim anlayışım için, bir kritik bölüm ile bir muteks arasındaki tek fark, birinin tek bir süreç içinde olması, diğerinin ise çapraz süreç olmasıdır. Daha sonra posix spinlock ve posix mutex arasındaki fark nedir? –

+0

@Billy: Bu cevap yardımcı olabilir, spinlocks meşgul beklemek, mutekses verim http://stackoverflow.com/questions/195853/spinlock-versus-semaphore –

cevap

6

O PTHREAD_PROCESS_SHARED ayarlanmış bir pshared özelliğiyle bir pthread_mutex_t bu. Ancak, böyle bir muteksin paylaşımlı belleğe yerleştirilmesinden siz sorumlusunuz, tüm süreçlerin erişebileceği - bu yüzden win32 API'si kadar basit değil.

Belki de win32'ye bir posix veya sysv semaphore daha yakındır. Geleneksel olarak, işlemler arasında senkronizasyon da, örneğin, dosya kilitleri kullanılarak gerçekleştirilmiştir. flock veya lockf (bu ses hiçbir zaman çalmayacağı kadar yavaş değildir)

+0

Kapsam sadece thread için geçerli değil mi? Sadece pthread_attr_t' işlevini pthread_create’e geçirebilirsiniz. Pthread_mutex_tr ile 'pthread_mutex_tr 'seçeneğini kullanmanız gerekir. –

+0

Haklısınız, pthread_mutexattr'ın pshared'i – nos

+0

'a ihtiyaç duyuyorsunuz Kilitlerin yavaşlığı (veya eksikliği) ile ilgili bir bağlantınız var mı? Daha fazla detay aradım ama ilginç bir şey bulamadım. Büyük paylaşımlı dosyaları olan büyük bir projemiz var ve kilitler yüzünden performans sorunları yaşadığımızdan şüpheleniyorum, ama nasıl öğreneceğimize dair hiçbir fikrim yok. –

0

IPC'yi işlemler arası işlemler için kullanmalısınız: borular, semaforlar, ileti sıraları veya paylaşılan bellek. Sanırım isminizdeki semaforlar iyi olurdu. Daha fazla bilgi için:

man 7 sem_overview 
+0

Paylaşılan belleği kullanmak istiyorum. Ancak yine de paylaşılan hafızada kilitleri gerçekleştirmenin bir yolu olmalı. –

+0

sem_init(), paylaşılan bellekte kilitler gerçekleştirmek için kullanılabilir. –

+0

Bu işe yaramaz semafor şeyleri unutun. Paylaşılan bir bellek nesnesi oluşturun ve ardından pshared muteks oluşturun. –

İlgili konular