Блокировка потока
Модератор: Модераторы разделов
-
trcie
- Сообщения: 21
- ОС: openSUSE 10.2
Блокировка потока
В программе выполняется n поковов. Необходимо при выполнении определенных действий блокировать все потоки кроме одного (определенного). Через мьютексы не получилось (не блокируется произвольный поток, а не определенный).Как это можно сделать?
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Блокировка потока
Алгоритм примерно слудующий:
Дополнительно смотрите тут: Программирование Unix Api
Код: Выделить всё
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: Блокировка потока
необходимо заблокировать поток не из его функции
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Блокировка потока
Для каждого потока создать по мьютексу и (раз)блокировать их из головного избирательно.
-
trcie
- Сообщения: 21
- ОС: openSUSE 10.2
Re: Блокировка потока
/dev/random писал(а): ↑14.02.2008 20:42Для каждого потока создать по мьютексу и (раз)блокировать их из головного избирательно.
как привязать мьютекс к потоку?
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Блокировка потока
Так как я показал.
Функции замораживающей поток нету (ну я не нашел, да и по логике быть не должно). Я так понимаю у Вас ситуация следующая: есть ресурс, совместно используемый всеми потоками, и нужно гарантировать одновременный доступ к нему только одно потока. Так?
Если так то на вопрос ответ уже есть, взял я его из книги "Программирование для Linux. Профессиональный подход".
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
dronord
- Сообщения: 40
- ОС: slackware
Re: Блокировка потока
Может pthread_rwlock нужен?
-
trcie
- Сообщения: 21
- ОС: openSUSE 10.2
Re: Блокировка потока
не произвольного, а КОНКРЕТНОГО потока
-
Zeus
- Сообщения: 694
Re: Блокировка потока
КОНКРЕТНОГО - это с определённым ID или с определёнными функциями?
По формулировке - задача сильно похожа на "много читателей - один писатель".
Т.е. pthread_rwlock.
По формулировке - задача сильно похожа на "много читателей - один писатель".
Т.е. pthread_rwlock.
-
trcie
- Сообщения: 21
- ОС: openSUSE 10.2
Re: Блокировка потока
Попробую применить. Хотелось бы что-нибудь поудобней, (типа thr_suspend из Sun)
-
dronord
- Сообщения: 40
- ОС: slackware
Re: Блокировка потока
Усыпить поток можно, сделав оболочку над ф-ями потоков. Например, класс
Ну и где-то в ф-ии потока тоже делать pthread_mutex_lock(&lock) и pthread_mutex_unlock(&lock).
Только, раз нет Suspend и Resume в библиотеке, значит они не нужны.
Засыпание нужно при доступе к разделяемому ресурсу или приостановке на некоторое время.
Для ресурса: все методы синхронизации блокируют выполняемый поток.
Для приостановки: nanosleep().
Т.е. то, чего ты хочешь, должно происходить неявно.
Код: Выделить всё
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().
Т.е. то, чего ты хочешь, должно происходить неявно.