Pthread win32 libraray,不支持PTHREAD_PROCESS_SHARED

时间:2010-11-16 00:29:46

标签: winapi pthreads posix mqueue pthreads-win32

我正在使用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线程函数来代替它。

注意:如果有人在win32中成功实现了mqueue? 感谢

5 个答案:

答案 0 :(得分:1)

您需要阅读Windows interprocess synchronization functions

对于Windows中的进程间互斥,您可以选择使用共享内存和InterlockedCompareExchange(旋转然后休眠或注意Event)来实现自己的互斥。

或者更容易编程但不是高效使用操作系统提供的名为Mutex的对象。这些比在进程的线程中使用CriticalSection差大约10倍。

在我自己的生产代码中,我从Linux pthreads移植,我使用第一个解决方案,但最终使用Mutex解决方案发布代码。它更可靠,我确信它适用于所有情况。

答案 1 :(得分:1)

我认识到你正在使用的代码......只需注释代码中的2行

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

...它可以作为进程内消息队列正常工作......除非您需要跨进程。

答案 2 :(得分:0)

我不知道您是否觉得在Win32 PThread库中感觉很舒服,但是,虽然无法获得完整的PTHREAD_PROCESS_SHARED行为,但可以使用DuplicateHandle API将内核对象的句柄复制到其他进程中 - 所以应该可以添加一些特定于Windows的扩展(可以在unix版本中编译),允许在进程之间共享互斥锁。

答案 3 :(得分:0)

•如果CreateMutex的lpMutexAttributes参数启用了继承,则CreateProcess函数创建的子进程可以继承互斥对象的句柄。此机制适用于命名和未命名的互斥锁。

•进程可以在调用DuplicateHandle函数时指定互斥对象的句柄,以创建可供其他进程使用的重复句柄。此机制适用于命名和未命名的互斥锁。

•进程可以在调用OpenMutex或CreateMutex函数时指定命名互斥锁,以检索互斥对象的句柄。

答案 4 :(得分:0)

我相信那是Aurelio Medina's code from 2000

不幸的是,他的测试代码是一个单独的进程,所以如果PTHREAD_PROCESS_SHARED标志设置与否,它并不关心,因为pthreads-32从未支持它。当他在2000年建立它时,我打赌pthreads甚至没有抛出错误,所以他的测试代码运行良好。

不幸的是,对于我们所有人来说,似乎他died in 2013,所以他不会完成他的作品。

我已经拿起火炬并重写了互斥锁/信号处理以使用本机窗口互斥和事件。请在这里查看代码:

<强> https://github.com/marklakata/mqueue-w32