Pthread win32 библиотека, PTHREAD_PROCESS_SHARED не поддерживается - PullRequest
2 голосов
/ 16 ноября 2010

Я использую библиотеку pthread win32 для реализации mqueue.Но когда он запускается в следующем коде, он выдает ошибку # 40 должен быть ENOSYS, означает, что система не поддерживается

pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
i = pthread_mutex_init(&mqhdr->mqh_lock, &mattr);
pthread_mutexattr_destroy(&mattr);      /* be sure to destroy */

Мне 40 после того, как все пойдет не так.Любое тело имеет представление об этом?или у вас есть какое-то другое альтернативное решение, например, используйте какую-либо функцию потока WIN32, чтобы заменить ее.

Примечание: если кто-нибудь успешно внедрит mqueue в win32?Спасибо

Ответы [ 5 ]

1 голос
/ 04 апреля 2013

Я узнаю код, который вы используете ... просто прокомментируйте 2 строки в коде

pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);

... она отлично работает как внутрипроцессная очередь сообщений ... если только она не нужна всем процессам.

1 голос
/ 16 ноября 2010

Вы захотите прочитать в Windows функции межпроцессной синхронизации .

Для межпроцессного мьютекса в Windows вы можете реализовать свой собственный, используя разделяемую память и InterlockedCompareExchange (вращайте, затем спите или наблюдайте за Событием ).

Или проще программировать, но не так, как эффективно, использовать предоставленную ОС с именем Mutex .Они работают примерно в 10 раз хуже, чем использование CriticalSection в потоках процесса.

В своем собственном рабочем коде я портировал с Linux pthreads, я играл с первым решением, но в итоге выпустилкод с использованием решения Mutex.Это было более надежно, и я был уверен, что это будет работать во всех случаях.

0 голосов
/ 02 мая 2014

Я полагаю, что это код Аурелио Медины от 2000 .

К сожалению, его тестовый код представлял собой отдельный процесс, поэтому ему было все равно, установлен флаг PTHREAD_PROCESS_SHARED или нет, поскольку pthreads-32 никогда не поддерживал его. Когда он построил его в 2000 году, я уверен, что pthreads даже не выдал ошибку, поэтому его тестовый код работает нормально.

К сожалению для всех нас, похоже, он умер в 2013 , поэтому он не собирается заканчивать свой опус.

Я взял факел и переписал мьютекс / обработку сигналов, чтобы использовать нативные мьютекс и события Windows. Пожалуйста, посмотрите здесь код:

https://github.com/marklakata/mqueue-w32

0 голосов
/ 16 ноября 2010

• Дочерний процесс, созданный функцией CreateProcess, может наследовать дескриптор объекта мьютекса, если параметр lpMutexAttributes наследования с поддержкой CreateMutex.Этот механизм работает как для именованных, так и для неназванных мьютексов.

• Процесс может указать дескриптор объекта мьютекса при вызове функции DuplicateHandle, чтобы создать дублирующий дескриптор, который может использоваться другим процессом.Этот механизм работает как для именованных, так и для безымянных мьютексов.

• Процесс может указать именованный мьютекс при вызове функции OpenMutex или CreateMutex для извлечения дескриптора объекта мьютекса.

0 голосов
/ 16 ноября 2010

Не знаю, чувствуете ли вы себя комфортно, взламывая библиотеку Win32 PThread, но, хотя полное поведение PTHREAD_PROCESS_SHARED не может быть достигнуто, можно дублировать дескрипторы объектов ядра в другие процессы, используя DuplicateHandle API - так что должно быть возможно добавить некоторые специфичные для Windows расширения (которые будут компилироваться в сборках Unix), которые позволяют совместно использовать мьютекс между процессами.

...