Я действительно в недоумении.Я внимательно прочитал статьи MSDN, но до сих пор не могу понять, что происходит.Моя проблема заключается в следующем: при запуске нескольких процессов со следующим кодом все работает:
HANDLE m = CreateMutex(NULL, FALSE, L"MyMutex");
char c[20] = "2print";
for(int iter = 0; iter<100; ++iter) {
WaitForSingleObject(m,INFINITE);
for(int i=0;i<(int)strlen(c);++i) {
for(int j=0;j<10000;++j)
printf("%c",c[i]);
}
BOOL ok = ReleaseMutex(m);
}
CloseHandle(m);
, то есть разные процессы печатают каждый свой ход и освобождают мьютекс, пока не завершится вся печать.
НО изменение CreateMutex на: (bInitialOwner с FALSE на TRUE)
HANDLE m = CreateMutex(NULL, TRUE, L"MyMutex");
первый создатель не освободит мьютекс!другие процессы просто сидят там.Что меня поразило, так это то, что, добавив еще один releaseMutex, он меняется:
BOOL ok = ReleaseMutex(m);
на:
BOOL ok = ReleaseMutex(m);
ok = ReleaseMutex(m);
заставить его работать!
я действительно запуталсяПочему первый создатель не выпустит мьютекс правильно?я попытался распечатать все ошибки, используя GetLastError, и то, что я получил, кажется разумным, например, ERROR_ALREADY_EXISTS для создателей, следующих за первым, что я и ожидаю (MSDN говорит, что в этой ситуации bInitialOwner просто игнорируется).