Блокировка потока

Модератор: Модераторы разделов

trcie
Сообщения: 21
ОС: openSUSE 10.2

Блокировка потока

Сообщение trcie »

В программе выполняется n поковов. Необходимо при выполнении определенных действий блокировать все потоки кроме одного (определенного). Через мьютексы не получилось (не блокируется произвольный поток, а не определенный).Как это можно сделать?
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Блокировка потока

Сообщение Voice »

Алгоритм примерно слудующий:

Код: Выделить всё

pthread_mutex_t our_mutex = PTHREAD_MUTEX_INITIALIZER;

int main()
{
    // тут порождаем потоки
}

void *thread_function(void *arg)
{
    ...
    pthread_mutex_lock(&our_mutex);
    // тут работаем с общим ресурсом
    pthread_mutex_unlock(&our_mutex);
    ...
}


Дополнительно смотрите тут: Программирование Unix Api
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
trcie
Сообщения: 21
ОС: openSUSE 10.2

Re: Блокировка потока

Сообщение trcie »

необходимо заблокировать поток не из его функции
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Блокировка потока

Сообщение /dev/random »

Для каждого потока создать по мьютексу и (раз)блокировать их из головного избирательно.
Спасибо сказали:
trcie
Сообщения: 21
ОС: openSUSE 10.2

Re: Блокировка потока

Сообщение trcie »

/dev/random писал(а):
14.02.2008 20:42
Для каждого потока создать по мьютексу и (раз)блокировать их из головного избирательно.

как привязать мьютекс к потоку?
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Блокировка потока

Сообщение Voice »

trcie писал(а):
14.02.2008 20:54
как привязать мьютекс к потоку?

Так как я показал. :)

Функции замораживающей поток нету (ну я не нашел, да и по логике быть не должно). Я так понимаю у Вас ситуация следующая: есть ресурс, совместно используемый всеми потоками, и нужно гарантировать одновременный доступ к нему только одно потока. Так?
Если так то на вопрос ответ уже есть, взял я его из книги "Программирование для Linux. Профессиональный подход".
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: Блокировка потока

Сообщение dronord »

Может pthread_rwlock нужен?
Спасибо сказали:
trcie
Сообщения: 21
ОС: openSUSE 10.2

Re: Блокировка потока

Сообщение trcie »

Voice писал(а):
14.02.2008 21:54
trcie писал(а):
14.02.2008 20:54
как привязать мьютекс к потоку?

Так как я показал. :)

Я так понимаю у Вас ситуация следующая: есть ресурс, совместно используемый всеми потоками, и нужно гарантировать одновременный доступ к нему только одно потока.


не произвольного, а КОНКРЕТНОГО потока
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Блокировка потока

Сообщение Zeus »

КОНКРЕТНОГО - это с определённым ID или с определёнными функциями?
По формулировке - задача сильно похожа на "много читателей - один писатель".
Т.е. pthread_rwlock.
Спасибо сказали:
trcie
Сообщения: 21
ОС: openSUSE 10.2

Re: Блокировка потока

Сообщение trcie »

Попробую применить. Хотелось бы что-нибудь поудобней, (типа thr_suspend из Sun)
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: Блокировка потока

Сообщение dronord »

Усыпить поток можно, сделав оболочку над ф-ями потоков. Например, класс

Код: Выделить всё

class Thread
{
pthread_mutex_t lock;
public:
.........
void Suspend()
{
    pthread_mutex_lock(&lock);
}

void Resume()
{
    pthread_mutex_unlock(&lock);
}
.........
};


Ну и где-то в ф-ии потока тоже делать pthread_mutex_lock(&lock) и pthread_mutex_unlock(&lock).

Только, раз нет Suspend и Resume в библиотеке, значит они не нужны.
Засыпание нужно при доступе к разделяемому ресурсу или приостановке на некоторое время.
Для ресурса: все методы синхронизации блокируют выполняемый поток.
Для приостановки: nanosleep().
Т.е. то, чего ты хочешь, должно происходить неявно.
Спасибо сказали: