Существует массив мьютексов.
Моя функция:
- Проверяет, заблокирован ли мьютекс
2a. Если нет, то блокирует его
2b. Если заблокировано, дождитесь разблокировки и заблокируйте его
Другая функция разблокирует его.
Проблема в том, что у меня произошел сбой в секции ожидания:
HANDLE mutexes[N];
void func(int i)
{
// (*) wait until unlocked or create if unlocked
while ((mutexes[i] = CreateMutex(NULL, TRUE/*same with FALSE*/, NULL)) != NULL);
/*or WaitForSingleObject(mutexes[i], INFINITE)*/
mutexes[i] = CreateMutex(NULL, TRUE, NULL);
}
В (*) моменте у меня произошел сбой - нарушение прав доступа. Сбой происходит при попытке создать мьютексы [i], которые уже были созданы ранее. Я не могу использовать WaitForSingleObject, потому что в первый раз мьютексы [i] не создаются и в документах говорится, что WaitForSingleObject не определен. Также, если я использую эту функцию, я получаю тот же сбой.
Все, что мне нужно, это аналог такого простого псевдокода
if (mutex_has_been_created[mutexes[i]])
WaitUntilRelease()
CreateMutex();
Я попытался обернуть его в критическом разделе и получил тот же результат. Я уверен, что i
находится в правильном диапазоне.
Я не могу использовать Boost / pThreads / и т.д.
Я знаю, что моя проблема довольно проста, но я не могу найти решение. Во всех примерах, которые я видел, мьютекс создается до WaitForSingleObject
, у меня это не работает.
Спасибо.