синхронизация на семафорах
Какое поведение требуется?
мне показалось что только я не понимаю в чем суть задачи...
Какое поведение требуется?
немного не понял вопрос
скажем так, все знают про такую вещь, как MPI_barrier в MPI
надо сделать её аналог для нескольких процессов (всё пускается на 1 машине но на семафорах
идея простая - надо, чтобы процессы из этой функции выходили одновременно (ну или почти одновременно)
все нашел про это в инете
да ладно, я и про семафоры не знаю
все нашел про это в инете
приятно нести свет в массы
теперь вот ещё одним человеком, знающим про MPI стало больше
но вопроса это не снимает....
Очень сильное утверждение...
У тебя решение плохое получается, циклы какие-то...
А можно использовать только семафоры? или можно использовать другие объекты синхронизации тоже?
Можно ли один из потоков сделать более главным, чем другие?
или наоборот, каждый сначала увеличивает на 1 а потом ждет когда оно будет больше (N-1)
другие процессы могут опять вызвать функцию синхронизации и увеличить значение еще не обнуленного семафора.
Выход из функции синхронизации необходимо делать всем процессам одновременно после обнуления всех семафоров.
поэтому и спрашиваю
это, конечно, хорошо, но вот как установить это начальное значение?
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);
}
здесь используются мутексы, а нужны были чисто семафоры
Мутекс - тоже семафор, только маленький еще.
но у меня прога не на тредах
два семафора, на вход в функцию и на выход.
На входе каждый процесс делает lock на первый семафор.
Далее - проверяет, можно ли его lock еще раз.
Если да - усыпает( пока не знаю как).
Если нет - значит, на нем уже висят все N процессов.
Тогда он их будит( тоже не знаю как, например через condvar в общей памяти).
Далее, то же самое они вытворяют с выходным семафором.
ну изредка еще и разлочивать надо
Короче, идея
Ага, то же самое, только на семафорах.
Ага
сейчас попробую реализовать
Оставить комментарий
serega435
как грамотно синхронизировать N процессов при помощи семафоров?может кто-нибудь подскажет?
у меня есть такой вариант:
1. каждый процесс при входе в функцию синхронизации увеличивает значение семафора каждого процесса на 1
2. в цикле ждёт пока сумма значение всех семафоров не будет равна N*N
3. потом процесс с рангом 0 обнуляет все семафоры, и всё процессы выходят из данной функции синхронизации
правильно ли так делать?
на 2 прцессах это вроде бы у меня сработало, а вот что будет дальше.... не хотелось бы проверять на практике, т.к. слишком многое от этого зависит
заранее спасибо