1

現在、WIN32 用に作成されたマルチスレッド ライブラリを Android/Linux に移植しようとしていますが、WIN32 ミューテックスが持つ特定の機能をマップしようとして少し問題が発生したようです。

Windows Mutex オブジェクトのドキュメントから:

他のプロセスのスレッドは、CreateMutex の呼び出しでオブジェクト名を指定することにより、既存のミューテックス オブジェクトへのハンドルを開くことができます。その名前のミューテックス オブジェクトが既に存在する場合、GetLastError は ERROR_ALREADY_EXISTS を返します。

Linux の man ページで、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 に答える