Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
#1

Как аннулироват потоки, которые заблокированы по перменной условия (pthread)? - C++

11.02.2012, 17:54. Просмотров 723. Ответов 5
Метки нет (Все метки)

И никак, что ли не аннулировать, получается?

Вот, допустим, есть несколько потоков которые заблокированы по переменной условия:
C++
1
2
3
4
5
pthread_mutex_lock (&mutex);
 if (!(mozno_idti)) {
  pthread_cond_wait(&cond, &mutex);
 }
pthread_mutex_unlock (&mutex);
Вот, допустим, их 10 штук и я щас СПОКОЙНО могу выбрать два из них. Выбрал, пишу:
C++
1
 pthread_mutex_unlock (&mutex);
Спокойненько то есть разблокировал мьютекс- потоки не дёргаются.

А щас у меня на очереди две операции (в таком порядке)

C++
1
2
3
4
5
//Отменяем условие-посылаем всем сигнал
pthread_cond_broadcast(&cond);
 
//Аннулируем потом
pthread_cancel(thread[8]));
Но в какой последовательности их выполнять? Очевидно, что если я сперва пошлю сигнал, а потом аннулирую поток, то что будет: а будет то, что поток сигнал получит и ПРОДОЛЖИТ работу и только через НЕКОТОРОЕ время анилируется, не спасёт и pthread_testcancel (), поток номер 8 запросто проскочит эту функцию и наделает делов, пока аннулируется!

Вывод: спеова аннулируем, потом посылаем сигнал. Тоже плохо!
C++
1
2
3
4
5
//Аннулируем потом
pthread_cancel(thread[8])); 
 
//Отменяем условие-посылаем всем сигнал
 pthread_cond_broadcast(&cond);
Ладно, аннулирование прошло нормально, поток не шевелится. Потом раз- получил сигнал, что можно шевелиться (аннулироваться в данном случае). Но не надо забывать, что вместе с сигналом им будет получен и мьютекс! И вот он аннулируется и унесёт с собой мьютекс, а остальные потоки, коих 9 штук (ну или там 8 или 7- сколько-то могут уже выйти изсамого первого кода), так мьютекс и не получат!

Что же делать, ребята? Спасибо, кто откликнется!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2012, 17:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как аннулироват потоки, которые заблокированы по перменной условия (pthread)? (C++):

Заставить pthread подождать, до выполнения условия - C++
есть поток типы pthread. Нужно заставить его подождать, до выполнения условия

Потоки в pthread - C++ Linux
суть моей проблемы: есть главный поток занимается рисованием на экране по данным и еще некоторыми вычислениями, второй поток занимается...

Условия и потоки - C#
Мой код Point playerPos; PictureBox player; bool forward = false, back = false, left = false, right = false; ...

Как поставить описание к картинке в перменной - PHP
Всем привет, так как в знаниях PHP не силен не могу подставить в переменную картинки соответствующее описание, переменная картинки...

Как проверить, входит ли значение какой-либо перменной в некоторый диапазон значений - Visual Basic
Новый семестр. Новые предметы. В том числе еще один алг. яз - VB Сейчас сижу, читаю методички, пробую что-то пыхтя и вот возник вопрос: ...

Как в Visual Studio 2008 подключить библиотеку pthread.h? - Visual C++
Подскажите как подключить библиотеку pthread.h в Visual Studio 2008?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
11.02.2012, 18:31 #2
Цитата Сообщение от kravam Посмотреть сообщение
Вот, допустим, их 10 штук и я щас СПОКОЙНО могу выбрать два из них. Выбрал, пишу:
C++
1
pthread_mutex_unlock (&mutex);
где выбрал, как выбрал, и где и для чего анлок?
т.е где это
Цитата Сообщение от kravam Посмотреть сообщение
Спокойненько то есть разблокировал мьютекс- потоки не дёргаются.
Добавлено через 3 минуты
могу, конечно, догадываться, что якобы разблокировал в (1)
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
2
3
4
5
pthread_mutex_lock (&mutex);
 if (!(mozno_idti)) {
  pthread_cond_wait(&cond, &mutex); // (1)
 }
pthread_mutex_unlock (&mutex);
но если так, то при блокировании в ф-ии pthread_cond_wait мьютекс итак разблокирован
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
11.02.2012, 19:06  [ТС] #3
Ну я выбираю потоки КАК ХОЧУ. А вообще у меня есть массив переменных pthread_t из 10-ти элементов, вот я из них выбираю... Рандомно две штуки, нормально?
+++++++++++++++++++++++++++++++++++++++++++=

А я не сказал сразу, надо было сказать, вот есть допустим 10 вспомогательных потоков, а есть один основной. Вот в основном-то и делается рандомный выбор подлежащих уничтожению, потом
C++
1
pthread_mutex_unlock (&mutex);
Тоже делается в основном
И аннулирование и посылание сигнала тоже происходит в основном потоке, а остальные стоят тут и ждут
C++
1
2
3
4
5
6
pthread_mutex_lock (&mutex);
 if (!(mozno_idti)) {
  //Вот они вызвали функцию, стоят тут и ждут
  pthread_cond_wait(&cond, &mutex); // (1)
 }
pthread_mutex_unlock (&mutex);
Вопрос остался
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
11.02.2012, 19:57 #4
все-таки не пойму что и зачем разблокируется здесь
C++
1
pthread_mutex_unlock (&mutex);
Добавлено через 10 минут
Цитата Сообщение от kravam Посмотреть сообщение
Ладно, аннулирование прошло нормально, поток не шевелится. Потом раз- получил сигнал, что можно шевелиться (аннулироваться в данном случае). Но не надо забывать, что вместе с сигналом им будет получен и мьютекс! И вот он аннулируется и унесёт с собой мьютекс, а остальные потоки, коих 9 штук (ну или там 8 или 7- сколько-то могут уже выйти изсамого первого кода), так мьютекс и не получат!
ааа вот ты о чем. сори не вчитывался. посмотри в сторону pthread_cleanup_* и спокойно юзай
C++
1
2
3
4
pthread_cancel(thread[8])); 
 
//Отменяем условие-посылаем всем сигнал
 pthread_cond_broadcast(&cond);
а на счет анлока в мэйне - вопрос остался.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
11.02.2012, 20:06  [ТС] #5
Ага, хотелось было похвастаться, самостоятельно найденным решением ну да ладно. Деструктор потока работает тьфу-тьфу-тьфу.

Если бы и щас переспрашивали, я бы

pthread_mutex_unlock (&mutex);
Убрал на фиг, она для понимания только лишняя!
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.02.2012, 23:50 #6
kravam, все твои темы лечат последствия криво спроектированной логики.

зри в корень.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2012, 23:50
Привет! Вот еще темы с ответами:

Как узнать, что поток закончился (библиотека pthread)? - C++
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает- да, созданный ранее поток Y закончился? ...

Pthread.h, как вернуть из потоковой функции значение типа double? - C++
Всем привет. Не понимаю, как вернуть из потоковой функции значение типа double: #include <pthread.h> #include <stdio.h> #include...

Как проверить порты TCP и какие из них заблокированы - Windows XP
Люди добрые снова ваша помощь нужна: На работе возникла проблема по поводу передачи данных заказчику, заказчик прислал письмо в котором...

Заблокированы соц сети и анонимайзеры. Как обойти ограничения? - Сети
Администратором на сервере заблокированы соц сети, а так же при попытке зайти на любой сайт анонимайзера так же не заходит, может идет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.02.2012, 23:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru