WaitForSingleObject не блокируется, все еще позволяя другим потокам изменять значение в C ++ - PullRequest
1 голос
/ 22 февраля 2011

Я пытаюсь использовать WaitForSingleObject(fork[leftFork], Infinite);, чтобы заблокировать переменную, используя несколько потоков, но кажется, что она ничего не блокирует

Я установил Handle fork[5], а затем использовал приведенный ниже код, но, похоже, он ничего не блокирует.

while(forks[rightFork] == 0 || forks[leftFork] == 0) Sleep(0);
WaitForSingleObject(fork[leftFork], INFINITE);
forks[leftFork]--;

WaitForSingleObject(fork[rightFork], INFINITE);
forks[rightFork]--; 

Я пробовал как WaitForMultipleObjects так же и тот же результат. Когда я создаю мьютекс, я использую fork[i]= CreateMutex(NULL, FALSE,NULL);

Мне было интересно, хорошо ли это для каждого потока или они делятся этим?

1 Ответ

3 голосов
/ 22 февраля 2011

Прежде всего, вы не показали достаточно кода, чтобы мы могли помочь вам с большой уверенностью в правильности.Но, сделав это условие, я все равно попробую!

Использование вами слова fork подсказывает мне, что вы приближаетесь к потокам Windows из фона pthreads.Потоки Windows немного отличаются.Как ни странно, самый эффективный объект-мьютекс в Windows - это не мьютекс , а фактически критическая секция .

Интерфейс для критическая секция намного проще в использовании, так как это, по сути, функция получения и соответствующая функция выпуска.Если вы синхронизируете внутри одного процесса и вам нужна простая блокировка (а не, скажем, семафор), вы должны использовать критические секции, а не мьютексы.

Фактически, только вчера здесь, в переполнении стека,Я написал более подробный ответ на вопрос, в котором описана стандартная схема использования критических разделов.В этом посте есть много ссылок на соответствующие разделы документации MSDN.

Сказав это, может показаться, что все, что вы пытаетесь сделать, - это синхронизировать убывание массива целочисленных значений.Если это так, то вы можете сделать это самым простым способом без блокировки с InterlockIncrement или одним из его друзей.

Вам нужно использовать мьютекс, только когда вы выполняете кросссинхронизация процессов.В действительности, вы должны использовать мьютекс только при синхронизации между процессами, потому что критические секции работают намного лучше (то есть быстрее).Так как вы обновляете здесь простой массив, и поскольку явно не происходит видимого IPC, я могу только заключить, что это действительно в процессе.

Если я ошибаюсь и вы действительно делаетепроцесс работы и требует мьютекса, тогда мы должны увидеть больше кода.Например, я не вижу звонков на ReleaseMutex.Я не знаю точно, как вы создаете свои мьютексы.

Если это не поможет, пожалуйста, отредактируйте свой вопрос, включив в него больше кода, а также обзор высокого уровня того, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...