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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) http://www.cyberforum.ru/cpp/thread444183.html
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой TID. После первого вывода TIDа каждым потоком срабатывает блокировка барьером. Ну то есть свсе потоки по разу выведут свой TID и ждут друг друга. После того, как все собрались, в вызывающий поток отправляется сигнал типа:"Мы собрались" (потоки пока не двигаются)....
C++ Внедрение мультиплеера C++ Привет дорогие форумчане. Возникла задача сделать мультиплеер для игры(исходных кодов которой я не имею) . Разбил на задачки и вот одна из них. Первая задача это перемещение игроков. вот моя идея. Нужно получить координаты одного игрока(P1) (x,y,z) передать на сервер,сервер передает всем остальным игрокам координаты P1(x,y,z). с этим я разобрался. теперь вопрос в другом ,как обработать... http://www.cyberforum.ru/cpp/thread443994.html
Графический интерфейс приложений на C? C++
Как сделать графический интерфейс приложения под Linux написанного на C?
C++ Ненулевая масса статического объекта в Box2D
Собственно как реализовать сабж?
C++ callback функция http://www.cyberforum.ru/cpp/thread443741.html
Здраствуйте!!! Занимаюсь разработкой снифера под DVB-карту. Пытаюсь получить MPEG-поток. Проблема заключается в том, что необходимо фрагментировать поток. При вызове функции установки сигнала вызывается callback-функция, которая записывает поток в файл. Как досрочно выйти из callback-функции. Она полностью захватывает поток и его нельзя фрагментировать. Кто знает, напишите свои...
C++ Использование C++ кода внутри программы на C: какие есть варианты? Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в программе на C. Переписывать заново функции с С++ на С не хочется, какие есть альтернативные пути решения? С точки зрения дизайна кода звучит это довольно дико, обычно всё наоборот. Может, есть какие-то флаги для линкера, чтобы он мог слинковать две единицы трансляции как надо? подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
11.02.2012, 17:54     Как аннулироват потоки, которые заблокированы по перменной условия (pthread)?
И никак, что ли не аннулировать, получается?

Вот, допустим, есть несколько потоков которые заблокированы по переменной условия:
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- сколько-то могут уже выйти изсамого первого кода), так мьютекс и не получат!

Что же делать, ребята? Спасибо, кто откликнется!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru