как установить приоритет для получения мьютекса в C / c

#c #c #windows #mutex #multiprocessing

#c #c #Windows #мьютекс #многопроцессорность

Вопрос:

У меня есть 3 процесса (одинаковый приоритет)

  1. P1
  2. P2
  3. P3 (таймер)

приоритет для получения мьютекса следующий: P1(1 priority), P2(2 priority), P3(timer)(3 priority)

Если предположить, что p3 приходит и получает мьютекс, то p2 приходит и ждет мьютекса, после чего приходит p1, и он также ожидает мьютекса

если p3 освободить мьютекс, то p1 мьютекс не p2 должен быть получен.

Как выполнить это на C или Си .

Примечание: все процессы выполняются внутри потоков, имеющих одинаковый приоритет.

Операционная система — Windows Xp

Комментарии:

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

2. Указано (к сожалению, я сейчас не помню, где именно), что даже если p1 вызывает WaitForSingleObject(), и только после этого p2 вызывает WaitForSingleObject(), все еще возможно, что p2 получит получение мьютекса до p1. Таким образом, это больше зависит от состояния операционной системы, а не от приоритета потоков.

3. Похоже, что вопрос касается многопроцессорности, а не многопоточности. Если это верно (т. Е. У вас действительно есть три процесса для синхронизации, а не потоки внутри одного процесса), то, пожалуйста, исправьте теги.

Ответ №1:

Поскольку потоки имеют одинаковый приоритет, какой поток получит блокировку, будет довольно произвольным. Похоже, вы хотите дождаться переменной условия, а не использовать простой мьютекс. У вас все равно будет мьютекс; переменные условия — это концепция поверх мьютексов. Другой возможностью является использование барьеров синхронизации.

РЕДАКТИРОВАТЬ: Пример использования переменных условий с использованием интерфейса pthreads (в стиле C): https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal

Важный вопрос, который вам нужно задать себе: со всем этим ожиданием и синхронизацией вы что-нибудь покупаете? Цель использования потоков — позволить некоторым вещам выполняться параллельно. Если этого не происходит, у вас многопоточное приложение, которое работает медленнее, чем если бы приложение вообще не использовало потоки.

Ответ №2:

 SetThreadPriority(
   HANDLE hThread,
   int nPriority
);
  

эта функция установит приоритет ваших потоков …. HANDLE значение, которое вы получите при создании потока .. например

 :HANDLE hf=_beginthred(abc,0,NULL) 
  

Ответ №3:

Получение блокировки на основе приоритета — это рецепт для взаимоблокировок. Блокировка всегда должна выполняться в предсказуемом порядке, иначе у вас будет классическая возможность (A, B), (B, A) взаимоблокировки.

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

Комментарии:

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

2. вместо того, чтобы позволять потокам сообщать ядру, какой у них приоритет (по сути, это «борьба» за блокировки), вы могли бы просто отправлять сообщения в централизованную очередь и использовать примитив синхронизации (например, семафор) для получения уведомлений о новых сообщениях — операционные системы имеют четкие гарантии или политики в отношении того, как они обрабатывают приоритеты и предотвращают «голодание» потоков. Это то, что я имею в виду, говоря «пусть ядро с этим справится».

Ответ №4:

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

Тот факт, что ваши процессы имеют одинаковый приоритет, не является проблемой, поскольку временной интервал потока будет зависеть от процесса и приоритета потока.