2

我正在使用 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?谢谢

4

5 回答 5

1

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

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

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

于 2013-04-03T21:59:43.613 回答
1

您将需要阅读 Windows进程间同步功能

对于 Windows 中的进程间互斥锁,您的选择是使用共享内存和InterlockedCompareExchange实现您自己的(旋转然后睡眠或监视Event)。

或者更容易编程但性能不如使用操作系统提供的命名互斥对象。这些性能比在进程的线程中使用CriticalSection差大约 10 倍。

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

于 2010-11-16T01:46:19.120 回答
0

我相信这是Aurelio Medina 从 2000 开始的代码

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

对我们所有人来说不幸的是,他似乎在 2013 年去世了,所以他不会完成他的作品。

我拿起了火炬并重写了互斥体/信号处理以使用本机 Windows 互斥体和事件。请在此处查看代码:

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

于 2014-05-01T20:48:48.070 回答
0

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

于 2010-11-16T09:37:35.927 回答
0

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

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

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

于 2010-11-16T20:03:58.053 回答