LINUX.ORG.RU

Блокировки в тредах


0

0

Хочется сделать следующее:
есть главный тред A и есть куча одинаковых тредов B. Треды B выполняют какую-то работу и должны периодически сообщать об окончании работы треду A и продолжать цикл. Причем один тред B может отработать шаг цикла за время x, соседний за y и тд. Не хочется чтобы главный тред опрашивал эти треды. Хочется чтобы он заснул на чем-то типа mutex и когда хотя бы один тред B закончит цикл хочется чтобы этот тред B заснул, тред A проснулся что-то сделал и заснул разблокировав тред B.

Получилось довольно не внятно... :( Что тут можно придумать ?

anonymous

Вообщем придумал так: один mutex на тред A и по одному mutex на каждый тред B. A делает для mutex(A) lock один раз и lock второй раз засыпая на этом. По окончании работы каждый B делает для mutex(A) unlock и продолжает работать а вот получение данных от тредов управляется для каждого треда B своим mutex(B).

anonymous
()
Ответ на: комментарий от anonymous

Вообще-то по-моему мутексы должны лочится и анлочится одной и той же нитью. Иначе могут быть траблы. А нужная тебе функциональность реализуется с помощью condition variables (man pthread_cond_signal).

anonymous
()
Ответ на: комментарий от anonymous

>man pthread_cond_signal
Спасибо. А какие траблы - я тестовый пример набросал все пашет !

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t mutex;

void* f(void*)
{
sleep(10);
pthread_mutex_unlock(&mutex);
return NULL;
}

int main()
{
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);

printf ("main(): step1\n");

pthread_t handle;
if (pthread_create(&handle, NULL, f, NULL) != 0)
{
printf ("ERROR: pthread_create()\n");
exit(1);
}

printf ("main(): step2\n");
pthread_mutex_lock(&mutex);
printf ("main(): step3\n");

return 0;
}

anonymous
()
Ответ на: комментарий от anonymous

Ну под linux наверное никаких:) В линуксовом мануале написано, что "this is non-portable behavior and must not be relied upon". Согласно POSIX "If a thread attempts to unlock a mutex that it has not locked or a mutex which is unlocked, undefined behavior results." Так что это просто можно считать плохим стилем.

anonymous
()
Ответ на: комментарий от anonymous

Почитал умные статьи ты вроде как прав :) Переделал так (тест):

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_t handle;
pthread_mutex_t mutex;
pthread_cond_t cond;

void* f(void*)
{
sleep(10);
pthread_cond_signal(&cond);
return NULL;
}

int main()
{
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
if (pthread_create(&handle, NULL, f, NULL) != 0)
{
printf ("ERROR: pthread_create()\n");
exit(1);
}
printf ("main(): step1\n");
if (pthread_cond_wait(&cond, &mutex) != 0)
{
printf ("ERROR: pthread_create()\n");
exit(1);
}
printf ("main(): step2\n");
return 0;
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.