我目前正在尝试将为WIN32编写的多线程库移植到Android / Linux上,而我似乎在试图映射WIN32互斥锁具有的特定功能时遇到了一些问题。
来自Windows Mutex Objects的文档:
其他进程中的线程可以打开现有互斥锁的句柄 通过在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());
}
答案 0 :(得分:1)
对命名的进程间互斥锁最简单的模拟可能是named realtime semaphore初始化为值为1(1)。尝试sem_open("/the_sem", O_CREAT|O_EXCL, mode, 1)
。如果你不是第一个,O_EXCL将失败并使用EEXIST,如果你不是第一个,那么没有标志的后续sem_open
应该成功:
sem_t *sem;
int isCreator = 0;
if ((sem = sem_open("/the_sem", O_CREAT|O_EXCL, mode, 1)) != SEM_FAILED) {
// We got here first
isCreator = 1;
} else {
if (errno != EEXIST) uh_oh_goodbye();
// We're not first. Try again
sem = sem_open("/the_sem", 0);
if (sem == SEM_FAILED) uh_oh_goodbye();
}
注意:如果同步对象在共享内存中初始化,那么可以共享进程之间的pthread互斥(以及匿名实时信号量)。 POSIX共享内存实时扩展也允许shared memory to be named。然后在创建共享内存和初始化互斥锁之间会有一些竞争,但在这种情况下,除了比赛获胜者之外,尝试调用pthread_mutex_init()
的所有人都应该使用EBUSY失败。