Использование переменных locks/condition, как вы можете сделать структуру программы C не позволяющей больше, чем n потоков одновременно выполнять тело функции f? Скажем, у вас есть 60 созданных потоков, и только 10 из них могут сразу войти в функцию. Не могли бы вы написать в псевдокоде как общую идею?Программа C не позволяет более, чем n потоков одновременно выполнять функцию f
ответ
Вам нужно мьютекс, переменная условия и целое число.
- Приобретение мьютекса.
- Пока целое число равно 10, блокируйте переменную условия.
- Приращение целого числа.
- Отпустить мьютексы.
- Вызовите функцию.
- Приобретать мьютексы.
- Уменьшить целое число.
- Трансляция переменной условия.
- Отпустить мьютексы.
Это похоже на очень окольный способ делать вещи, когда существуют семафоры. –
@ TimČas Я считаю это злоупотреблением семафором. Семафоры подходят, когда одна задача создает что-то, а другая задача ее использует. Использование их в качестве барьера является уродливым. См. [Эту статью] (http://www.barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore) для получения дополнительной информации. –
Семафоры используются для управления доступом к ограниченному количеству ресурсов (например, 10 запущенных функций). Вот что это такое. –
Семафор, а @zwol предложил, хорошо подходит для этой работы:
- Вы создаете семафор с его начальным значением является число потоков, чтобы в функции в любой момент времени ,
- Первое, что делает функция, это выполнить
sem_wait()
на семафоре. - Вы гарантируете, что на каждом возможном пути кода функция выполняет
sem_post()
ровно один раз перед возвратом.
@DavideVisentin, и что, собственно, является «блокировкой» в этом контексте? Не мьютекс - или, по крайней мере, не ясно, что это должен быть мьютекс. Я интерпретирую вопрос о том, как использовать объекты синхронизации вообще, из которых «блокировки» и условные переменные называются примерами. –
Вы ищете [семафоры] (http://linux.die.net/man/3/sem_wait). – zwol