我目前正尝试将一个为WIN32编写的multithreading库移植到Android / Linux,我似乎遇到了一些问题,试图映射WIN32互斥体具有的特定function。
从Windows Mutex对象的文档:
其他进程中的线程可以通过在调用CreateMutex中指定对象名称来打开现有互斥对象的句柄。 如果具有该名称的互斥对象已经存在,则GetLastError返回ERROR_ALREADY_EXISTS。
我无法在Linux手册页中find任何与Windows API提供的信息相关的信息。
我问这个问题的主要原因是我正在移植的互斥体创build代码包含:
isCreator = !(::GetLastError() == ERROR_ALREADY_EXISTS);
isCreator
是一个布尔数据types。 (不知道它用于什么,但我认为它很重要)。
编辑:
mutex = PTHREAD_MUTEX_INITIALIZER; // attributes?? if (pthread_mutex_init(&mutex, NULL) != 0) { throw Nv_EXCEPTION(XCPT_ResourceAllocationFailure, GetLastError()); }
最简单的类似于一个已命名的进程间互斥体可能是一个已初始化为一(1)值的已命名的实时信号量 。 尝试sem_open("/the_sem", O_CREAT|O_EXCL, mode, 1)
。 如果你不是第一个,O_EXCL将会失败,并且如果你不是第一个, sem_open
没有标志的后续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共享内存实时扩展也允许命名共享内存 。 在创建共享内存和初始化互斥量之间存在一些竞争,但是在这种情况下,尝试调用pthread_mutex_init()
将会失败,除了竞赛获胜者之外的所有其他人都将失败。