как установить приоритет для получения мьютекса в C / c ++ - PullRequest
6 голосов
/ 30 мая 2011

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

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

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

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

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

Как это сделать на C или C ++.

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

ОС - windows Xp

Ответы [ 4 ]

2 голосов
/ 29 июля 2014
SetThreadPriority(
   HANDLE hThread,
   int nPriority
);

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

:HANDLE hf=_beginthred(abc,0,NULL) 
2 голосов
/ 30 мая 2011

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

EDIT: Пример использования условных переменных с использованием интерфейса pthreads (стиль C): https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal

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

1 голос
/ 06 июня 2011

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

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

0 голосов
/ 06 июня 2011

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

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

...