Как запланировать это многопоточное приложение? - PullRequest
1 голос
/ 15 ноября 2011

давайте рассмотрим пример ..

некоторая сложная работа разделена на 4 потока

thread -A is calling function_A
thread -B is calling function_B
thread -C is calling function_C
thread -D is calling function_D

теперь условие состоит в том, что поток A, B, C может работать одновременно, но когда-либо потокD выполняет function_D, он увидит, выполняет ли какой-нибудь поток из A, B, C эту функцию?если да, то он будет ожидать их завершения, и когда никакой поток из a, b, c не выполняет там функцию, поток D начнет выполнять функцию D.

Как я могу это сделать?Любая идея ерш?

РЕДАКТИРОВАТЬ: function_A, function_B, function_c использует один дескриптор.и function_D закрывает этот дескриптор.Когда какая-либо функция использует этот дескриптор, она не должна закрываться функцией function_d.

Ответы [ 3 ]

7 голосов
/ 15 ноября 2011

Это звучит как задание для счетного семафора.

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

Если вы реализуете это без заботы о том, когда поток D запускается, не удивляйтесь, если поток D запускается раньше A, B или C и немедленно закрывает дескриптор.

3 голосов
/ 15 ноября 2011

Вы должны взглянуть на информацию об управлении синхронизацией.

Зависит от вашего дизайна, может быть много способов добиться такого поведения:

  1. Поток AC получает свойсобственный мьютекс / критическая секция перед запуском, и поток D получает все свои мьютексы перед запуском.

  2. Иметь счетный семафор со счетчиком 3. Поток AC получает семафор один раз, а поток D получаетэтот семафор 3 раза

  3. Используя блокировку чтения-записи, поток AC получает блокировку чтения, а поток D получает блокировку записи

и т. д.....

Все зависит от вашего дизайна, и вы здесь единственный, кто знает, какая стратегия наиболее рациональна в вашем дизайне.

3 голосов
/ 15 ноября 2011

Вам нужно будет синхронизировать эти потоки самостоятельно, ОС не будет гарантировать никакой синхронизации.
Простейшим способом является использование семафоров или условных переменных.

...