синхронизация на семафорах

serega435

как грамотно синхронизировать N процессов при помощи семафоров?
может кто-нибудь подскажет?
у меня есть такой вариант:
1. каждый процесс при входе в функцию синхронизации увеличивает значение семафора каждого процесса на 1
2. в цикле ждёт пока сумма значение всех семафоров не будет равна N*N
3. потом процесс с рангом 0 обнуляет все семафоры, и всё процессы выходят из данной функции синхронизации
правильно ли так делать?
на 2 прцессах это вроде бы у меня сработало, а вот что будет дальше.... не хотелось бы проверять на практике, т.к. слишком многое от этого зависит
заранее спасибо

Dasar

Какое поведение требуется?

pulmo

мне показалось что только я не понимаю в чем суть задачи...

serega435

Какое поведение требуется?

немного не понял вопрос
скажем так, все знают про такую вещь, как MPI_barrier в MPI
надо сделать её аналог для нескольких процессов (всё пускается на 1 машине но на семафорах
идея простая - надо, чтобы процессы из этой функции выходили одновременно (ну или почти одновременно)

pulmo

ну вот про симафоры я знаю а про такую вещь, как MPI_barrier в MPI понятия не имею не чисто тут чую
все нашел про это в инете

hoha32

да ладно, я и про семафоры не знаю

serega435

все нашел про это в инете

приятно нести свет в массы
теперь вот ещё одним человеком, знающим про MPI стало больше
но вопроса это не снимает....

Dasar

> скажем так, все знают про такую вещь, как MPI_barrier в MPI
Очень сильное утверждение...
У тебя решение плохое получается, циклы какие-то...
А можно использовать только семафоры? или можно использовать другие объекты синхронизации тоже?
Можно ли один из потоков сделать более главным, чем другие?

pulmo

изначально устанавливается значение одного семафора в N, потом каждый процесс зайдя в процедуру умньшает это число на 1 и ждет пока оно не станет 0, далее по обстоятельствам...
или наоборот, каждый сначала увеличивает на 1 а потом ждет когда оно будет больше (N-1)

jenja35

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

serega435

согласен
поэтому и спрашиваю

serega435

это, конечно, хорошо, но вот как установить это начальное значение?

ppplva

Вот чему учат на мехмате

void synchronize(int total_threads)
{
static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condvar_in=PTHREAD_COND_INITIALIZER;
static pthread_cond_t condvar_out=PTHREAD_COND_INITIALIZER;
static int threads_in;
static int threads_out;
int i, j;
pthread_mutex_lock(&mutex);
threads_in++;
if (threads_in>=total_threads)
{
threads_out=0;
pthread_cond_broadcast(&condvar_in);
}
else
while (threads_in<total_threads)
pthread_cond_wait(&condvar_in,&mutex);
threads_out++;
if (threads_out>=total_threads)
{
threads_in=0;
pthread_cond_broadcast(&condvar_out);
}
else
while (threads_out<total_threads)
pthread_cond_wait(&condvar_out,&mutex);
pthread_mutex_unlock(&mutex);
}

Andr163

здесь используются мутексы, а нужны были чисто семафоры

ppplva

Мутекс - тоже семафор, только маленький еще.

serega435

я сам с ММ, поэтому эту богачёвскую вещь знаю
но у меня прога не на тредах

ppplva

Такая идея:
два семафора, на вход в функцию и на выход.
На входе каждый процесс делает lock на первый семафор.
Далее - проверяет, можно ли его lock еще раз.
Если да - усыпает( пока не знаю как).
Если нет - значит, на нем уже висят все N процессов.
Тогда он их будит( тоже не знаю как, например через condvar в общей памяти).
Далее, то же самое они вытворяют с выходным семафором.

Fanatik

ну изредка еще и разлочивать надо

golovsv83

Короче, идея

ppplva

Ага, то же самое, только на семафорах.

ppplva

Ага

serega435

сейчас попробую реализовать
Оставить комментарий
Имя или ник:
Комментарий: