1

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

1 回答 1

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 共享内存实时扩展也允许命名共享内存。然后在创建共享内存和初始化互斥体之间存在一些竞争,但在这种情况下,除了比赛获胜者之外,尝试调用pthread_mutex_init()应该会失败并出现 EBUSY。

于 2012-12-06T04:13:48.877 回答