Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

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

11.02.2012, 17:54. Показов 1459. Ответов 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- сколько-то могут уже выйти изсамого первого кода), так мьютекс и не получат!

Что же делать, ребята? Спасибо, кто откликнется!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2012, 17:54
Ответы с готовыми решениями:

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

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

Как полностью аннулировать переменную?
Здравствуйте, У меня есть прокси dll DirectX9 и при сворачивании нужно удалять все созданные мной объекты, но у меня что то не выходит....

5
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
11.02.2012, 18:31
Цитата Сообщение от 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 мьютекс итак разблокирован
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
11.02.2012, 19:06  [ТС]
Ну я выбираю потоки КАК ХОЧУ. А вообще у меня есть массив переменных 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);
Вопрос остался
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
11.02.2012, 19:57
все-таки не пойму что и зачем разблокируется здесь
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);
а на счет анлока в мэйне - вопрос остался.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
11.02.2012, 20:06  [ТС]
Ага, хотелось было похвастаться, самостоятельно найденным решением ну да ладно. Деструктор потока работает тьфу-тьфу-тьфу.

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

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

зри в корень.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2012, 23:50
Помогаю со студенческими работами здесь

Как правильно обратиться к переменной агента из условия?
Добрый день! Вопрос наверняка пустяковый, но не могу найти правильный ответ. В модели между цехами перемещаются грузовики, пустые или...

Как дать пользователю домена разрешение аннулировать (Reset) свой пароль
Собственно вопрос в заголовке, если кто может подсказать, буду очень признателен. 1) Но только свой пароль, и никаких других...

Как в теле цикла поменять значение переменной из условия?
Вобщем цикл классический - переменная приращается на единицу до заданного предела. Но хочу, что бы величену этой перемнно можно было всякий...

Условия IF ELSE как выполнить операторы если переменной НЕсуществует
Есть переменная $_GET ее надо проверить на несуществование при условии что у меня есть еще куча переменных которые надо проверить на...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru