Гарантирует ли C++ std::binary_semaphore FIFO?

avatar
Attra
8 августа 2021 в 18:54
195
0
3

Я хочу использовать std::binary_semaphore, чтобы убедиться, что потоки обрабатываются в том порядке, в котором они вошли в семафор.

Я знаю, что очереди семафоров обычно FIFO, но я не могу гарантировать, что реализация C++ FIFO.

Является ли C++ std::binary_semaphore FIFO? Другими словами, пробуждает ли он потоки в том порядке, в котором они появились?

Источник
sbabbi
8 августа 2021 в 19:39
3

Если на acquire ожидают два потока, как вы проследите, какой из них пришел первым? В libstdc++ binary_semaphore, по-видимому, использует фьютекс, который не дает никаких гарантий относительно того, какой поток будет разбужен при выпуске.

Alex Guteniev
8 августа 2021 в 19:39
1

Я думаю, что это определяется реализацией. Реализация MSVC основана на API WaitOnAddress, который почти FIFO.

kuroi neko
8 августа 2021 в 19:43
2

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

Attra
8 августа 2021 в 21:10
0

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

Richard Critten
8 августа 2021 в 21:26
1

Прочтите coderhelper.com/questions/14792016/… В основном это то, что вам нужно написать поверх предоставленных примитивов, если ваша ОС не может дать какую-то гарантию.

sbabbi
8 августа 2021 в 21:51
0

Даже если вы пробуждаете свои потоки в порядке FIFO, нет никакой гарантии, что поток не будет вытеснен сразу же после пробуждения. Кажется, вы хотите настроить приоритеты, вам может понадобиться что-то вроде sched_setscheduler(SCHED_FIFO)

Martin James
9 августа 2021 в 15:33
0

@Attra «Я думаю, что во многих случаях мы абсолютно хотим, чтобы каждый поток обрабатывался FIFO», хорошо, не используйте один семафор.

Ответы (0)