如何确定Linux中是否已存在互斥对象?

时间:2012-12-06 03:05:11

标签: android linux windows multithreading porting

我目前正在尝试将为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());
}

1 个答案:

答案 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失败。