2016-09-01 9 views
0

Использование переменных locks/condition, как вы можете сделать структуру программы C не позволяющей больше, чем n потоков одновременно выполнять тело функции f? Скажем, у вас есть 60 созданных потоков, и только 10 из них могут сразу войти в функцию. Не могли бы вы написать в псевдокоде как общую идею?Программа C не позволяет более, чем n потоков одновременно выполнять функцию f

+4

Вы ищете [семафоры] (http://linux.die.net/man/3/sem_wait). – zwol

ответ

2

Вам нужно мьютекс, переменная условия и целое число.

  1. Приобретение мьютекса.
  2. Пока целое число равно 10, блокируйте переменную условия.
  3. Приращение целого числа.
  4. Отпустить мьютексы.
  5. Вызовите функцию.
  6. Приобретать мьютексы.
  7. Уменьшить целое число.
  8. Трансляция переменной условия.
  9. Отпустить мьютексы.
+0

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

+0

@ TimČas Я считаю это злоупотреблением семафором. Семафоры подходят, когда одна задача создает что-то, а другая задача ее использует. Использование их в качестве барьера является уродливым. См. [Эту статью] (http://www.barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore) для получения дополнительной информации. –

+1

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

2

Семафор, а @zwol предложил, хорошо подходит для этой работы:

  • Вы создаете семафор с его начальным значением является число потоков, чтобы в функции в любой момент времени ,
  • Первое, что делает функция, это выполнить sem_wait() на семафоре.
  • Вы гарантируете, что на каждом возможном пути кода функция выполняет sem_post() ровно один раз перед возвратом.
+0

@DavideVisentin, и что, собственно, является «блокировкой» в этом контексте? Не мьютекс - или, по крайней мере, не ясно, что это должен быть мьютекс. Я интерпретирую вопрос о том, как использовать объекты синхронизации вообще, из которых «блокировки» и условные переменные называются примерами. –