2011-01-23 3 views
5

POSIX mutex эквивалентен CRITICAL_SECTION от Win32 - его объем ограничен одним процессом. Мутекс Win32 (фактически называемый «мутантом» в земле NT) служит механизмом блокировки перекрестного процесса. Что такое эквивалент pthreads для перекрестных процессов?Что такое эквивалент POSIX для Mutex Win32?

+0

'CRITICAL_SECTION' ближе к' pthread_spinlock_t', мьютекс будет 'WaitForSingleObject' /' 'ReleaseMutex' против pthread_mutex_t'. –

+0

@ Steve-o: В чем разница между этими двумя? К моему (хотя и ограниченному) пониманию единственная разница между критическим разделом и мьютексом заключается в том, что он находится в рамках одного процесса, а другой - кросс-процесс. В чем же тогда разница между спин-блокисом posix и мьютексом posix? –

+0

@Billy: этот ответ может помочь, спрятаны ожидание-ожидание, выход из мьютекса http://stackoverflow.com/questions/195853/spinlock-versus-semaphore –

ответ

6

Это pthread_mutex_t с атрибутом pshared равным PTHREAD_PROCESS_SHARED. Тем не менее, вы несете ответственность за размещение такого мьютекса в общей памяти, что все процессы могут получить доступ - так что это не так просто, как win32 api.

Возможно, ближе к win32 находится posix или семафор sysv. Традиционно синхронизация между процессами также выполнялась с использованием блокировок файлов, например. стадо или lockf (это никоим образом не так медленно, как это может показаться)

+0

Не распространяется ли область на темы? Вы можете передать только 'pthread_attr_t' в' pthread_create'. Вам нужно использовать 'pthread_mutexattr_t' с' pthread_mutex_init'. –

+0

Вы правы, это pshared of pthread_mutexattr вам понадобится – nos

+0

У вас есть ссылка на медленность (или отсутствие таковой) замков? Я искал более подробную информацию об этом, но не нашел ничего интересного. У нас большой проект с большими файлами, и я подозреваю, что у нас есть проблемы с производительностью из-за блокировок, но я понятия не имею, как это выяснить. –

0

Вы должны использовать IPC для операций кросс-процесса: каналы, семафоры, очереди сообщений или разделяемую память. Я думаю, что в вашем случае названные семафоры будут в порядке. Для получения дополнительной информации:

man 7 sem_overview 
+0

Я хочу использовать общую память. Но все же должен быть способ выполнить блокировки в этой общей памяти. –

+0

sem_init() может использоваться для выполнения блокировок в общей памяти. –

+0

Забудьте об этом бесполезном семафоре. Создайте объект общей памяти, а затем создайте в нем мьютекс pshared. –

Смежные вопросы