【发布时间】:2012-11-24 01:11:52
【问题描述】:
我目前正在尝试将针对 WIN32 编写的多线程库移植到 Android/Linux,但在尝试映射 WIN32 互斥锁具有的特定功能时似乎遇到了一些问题。
来自 Windows 互斥对象的文档:
其他进程中的线程可以打开现有互斥锁的句柄 通过在对 CreateMutex 的调用中指定对象名称来创建对象。如果一个 同名互斥对象已经存在,GetLastError 返回 ERROR_ALREADY_EXISTS。
我无法在 Linux 手册页中找到与 Windows API 提供的内容类似的任何信息。
我问这个问题的主要原因是我要移植的互斥体创建代码包含:
isCreator = !(::GetLastError() == ERROR_ALREADY_EXISTS);
其中isCreator 是布尔数据类型。 (不确定它的用途,但我认为它很重要)。
编辑:
mutex = PTHREAD_MUTEX_INITIALIZER;
// attributes??
if (pthread_mutex_init(&mutex, NULL) != 0) {
throw Nv_EXCEPTION(XCPT_ResourceAllocationFailure, GetLastError());
}
【问题讨论】:
-
你在 Linux 上使用什么互斥锁?
-
ERROR_ALREADY_EXISTS 在很多情况下确实不是“错误”;如果它只是意味着之前的线程已经创建了它。当您实际上第一次创建互斥锁时,查看 sn -p isCreator 设置。
-
@seand:最大的问题是 Windows 互斥锁似乎是系统范围的,而 pthread 互斥锁是每个进程的。
-
那么如果某个特定线程/进程已经创建了一个互斥锁,那么在 Linux 上没有办法查明吗?是因为 Linux 上的互斥锁没有命名吗?
-
这完全取决于您如何实现互斥锁。
标签: android linux windows multithreading porting