2010-11-16 32 views
2

我使用pthread win32庫來實現mqueue。 但是當它運行到下面的代碼時,它拋出#40錯誤應該是ENOSYS,意味着系統不支持。Pthread win32 libraray,PTHREAD_PROCESS_SHARED不支持

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線程函數來替換它。

注意:如果有人在win32中成功實現了mqueue? 謝謝

+0

http://stackoverflow.com/questions/1166316/what-is-the-performance-of-boostinterprocess-mutex-vs-win32-native-mutexes – 2010-11-16 01:56:50

+0

http://stackoverflow.com/questions/2808617/difference-between-locks-mutex-and-critical-sections – 2010-11-16 01:58:39

回答

1

你會想要閱讀在Windows interprocess synchronization functions

對於Windows中的進程間互斥,您的選擇是使用共享內存來實現您自己的選擇,然後使用InterlockedCompareExchange(旋轉然後休眠或查看Event)。

或者更容易編程,但不能作爲性能是使用提供名爲Mutex對象的操作系統。這些執行比在進程的線程中使用CriticalSection差10倍。

在我自己的生產代碼中,我正在從Linux pthreads移植,我使用了第一種解決方案,但最終使用Mutex解決方案發布了代碼。這是更可靠的,我確信它可以在任何情況下工作。

0

我不知道你是否對Win32 PThread庫內部的黑客行爲感到滿意,但是當完整的PTHREAD_PROCESS_SHARED行爲無法實現時,有可能使用DuplicateHandle API將內核對象的句柄複製到其他進程中 - 所以它應該可以添加一些特定於Windows的擴展(可以在unix版本中編譯),以便在進程之間共享互斥鎖。

0

•如果CreateMutex的lpMutexAttributes參數啓用了繼承,則由CreateProcess函數創建的子進程可以繼承對互斥對象的句柄。該機制適用於已命名和未命名的互斥體。

•進程可以在調用DuplicateHandle函數時指定互斥對象的句柄,以創建可供其他進程使用的重複句柄。該機制適用於已命名和未命名的互斥體。

•進程可以在調用OpenMutex或CreateMutex函數時指定一個已命名的互斥體,以檢索互斥體對象的句柄。

1

我認出你正在使用的代碼...只是發表意見2行中的代碼

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

...它正常工作的進程內消息隊列......除非您在需要它流程。

0

我認爲是Aurelio Medina's code from 2000

不幸的是,他的測試代碼是一個單獨的進程,所以它不關心是否設置了PTHREAD_PROCESS_SHARED標誌,因爲pthreads-32從來不支持它。當他在2000年構建它時,我敢打賭,pthreads甚至沒有發出錯誤,所以他的測試代碼運行良好。

不幸的是,我們所有人看來他是died in 2013,所以他不會完成他的作品。

我已經採取了火炬,並重寫了互斥/信號處理使用本機窗口互斥和事件。請看看這裏的代碼:

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