![]() |
|
Модераторы: xvr |
![]()
|
|
| XaverOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.3.2011 Репутация: нет Всего: нет |
Учусь работать с потоками на линуксовом с++. Решил написать тестовую программу устроена следующим образом: существует класс при создании объекта класса происходит запуск потока который все время в бесконченом цикле увеличивает значение переменной если значение больше 532, переменная становится равна 0, так же в классе есть метод который позволяет получить значение этой переменной. Для организации взаимного исключения использовались мьютексы.
Данный код возвращает ошибку сегментации не могу понять почему |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
| XaverOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.3.2011 Репутация: нет Всего: нет |
Предлагаете переделать вот так?
Это сообщение отредактировал(а) XaverOz - 9.3.2011, 22:10 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
ну вообще поток перед выходом нужно прибить.. используя pthread_cancel() или вставить в цикл проверку на завершение и дождаться пока он сам умрет с помощью pthread_join()
а потом выходить.. Это сообщение отредактировал(а) fish9370 - 10.3.2011, 10:46 -------------------- undefined |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
да и мютекс выделеный динамически нужно освобождать функцией pthread_mutex_destroy()..
-------------------- undefined |
|||
|
||||
| XaverOz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 9.3.2011 Репутация: нет Всего: нет |
спасибо заработало
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
не нужно. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
не уверен, что это безопасно.. прошу аргументированный ответ.. -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
boostcoder, ты в вопросе не разбираешься.. ты бы хоть сказал на какой ман ты ссылаешься..
Это сообщение отредактировал(а) fish9370 - 10.3.2011, 21:22 -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
раз уж ты так сказал, значит так и есть |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
я мог бы и промолчать, но это и без того видно.. ты воздух сотрясаешь, а по делу тебе сказать нечего.. мое мнение.. -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
ну... это самый весомый аргумент. даже не поспоришь |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
может, ты все-таки перестанешь умничать, и что-то ответишь? напаминаю вопрос: почему ты считаешь, завершение главного потока, без завершения дочерних потоков, безопасным? Это сообщение отредактировал(а) fish9370 - 10.3.2011, 22:32 -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
fish9370, ты правда веришь, что у меня получится в миллион_первый раз написать man по pthread_cancel(), и кучу материала в инетах описывающего надобность и принцип работы этой функции, лучше чем это написали до меня?
я не верю. потому и не вижу смысла сотрясать воздух. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
я нарисую ситуацию которая была у меня, и почему я вообще задал этот вопрос..
я написал программку, в которой есть консоль, и некоторый набор команд.. одна из команд загрузить модуль, выгрузить модуль.. (модуль это .so) в одном из модулей есть поток, в котором он слушет один сокет и при получении из него данных, с некоторым преобразованием, записывает в другой.. все прекрасно работает.. но что я заметил - если попытаться выгрузить этот модуль мы получаем нарушение сегментации.. если поток предварительно прибить нарушения не наблюдается.. почему так? я понимаю, что случай здесь другой, но что это абсолютно безопасно, я не уверен.. я не просил ман по команде pthread_cancel(), я хотел чтобы ты описал процесс убийства дочерних потоков в реализации pthreads.. чтобы я успокоился, потому-что это безопасно.. спасибо.. Это сообщение отредактировал(а) fish9370 - 10.3.2011, 23:36 -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
в "расширенный" манах и литературе по программированию под линукс, о pthread_cancel() пишется как об одном из вариантов завершения(прерывания) потока. так же, в большинстве расширенной литературы, есть оговорка о том, pthread_cancel() поток не завершает. так же, есть оговорка о том, что для того чтоб поток завершился при вызове pthread_cancel(), в функции потока должны быть функции, являющиеся точкой выхода, и приводится список таких функций. так же, говориться о том, что если ты не уверен в том, является ли какая-то функция точкой выхода, то нужно вставить в код функции потока вызов pthread_testcancel(). и напоследок, говориться о том, что все же лучше, принцип прерывания потока взять в свои руки, реализовав проверку некоторого флага(желательно атомарного, на худой конец volatile), значение которого указывает на реакцию функции потока.
что-то еще? Это сообщение отредактировал(а) boostcoder - 10.3.2011, 23:48 |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
ты все-таки првел мне ман по pthread_cancel() но я настаиваю на своем вопросе, как реализованы потоки в pthreads? где гарантии, что они не будут реализованны в виде отдельных процессов (на какой-то платформе, в какой-то версии ядра)? где гарантии, что дочерний процесс ядро убъет раньше чем родителя? и тот не обратится к данным которые уже не принадлежат родительскому процессу, потому-что тот уже откинулся.. полагаю, что ответы на это есть в стандарте, и думал ты знаешь где именно.. Это сообщение отредактировал(а) fish9370 - 10.3.2011, 23:58 -------------------- undefined |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
ты не заметил, что у тебя уже пять разных вопросов? и только в последнем посте их три. я ответил на этот вопрос: остальное - в новой теме. Добавлено @ 00:05 а это: не располагает к какой-то помощи в твою пользу. и...попросту пустозвонство, говорящее о том, что ты пытаешься повысить свою самооценку. мерзко и противно... Это сообщение отредактировал(а) boostcoder - 11.3.2011, 00:43 |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
мда.. свою самооценку..
мне впринципе, все-равно, что ты не знаешь ответ.. и помощь мне твоя не нужна, я для себя давно решил, из собственного опыта - прежде чем завершить главный процесс убедись, что все дочерние потоки мертвы - это надежно.. Это сообщение отредактировал(а) fish9370 - 11.3.2011, 08:38 -------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
ну и зачем на форуме остальным настроение портить ? сами все знаете - просто отлично.. но для чего тогда тему создали, и убили время тех, кто зашел сюда Вам помочь ? с другой стороны хорошо, что Вы сразу свою позицию сразу обозначили, значит в следующие Ваши темы можно даже и не заглядывать.. Это сообщение отредактировал(а) mes - 11.3.2011, 00:26 |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
mes, я сказал мне его помощь не нужна, я прошу прощения непосредственно перед Вами..
а если взглянуть на его ответ типа - RTFM (Read The Fucking Manual), то думаю моя реакция вполне оправдана.. при том, что он совершенно не отвечал по теме (и так и не ответил) да, и тему не я создал.. -------------------- undefined |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
а остальные пусть и дальше ходят оскорбленными ..
ну прежде всего оскорбление (если такое можно притянуть к _общепринятому_ термину) направлено было в сторону документации, а не на Вас лично.. достаточно было уточнить, что Вы знакомы с нужной докой... и если оставались непоонятные вопросы постараться сконкретизировать их.. Вы же вместо этого перешли на личности и при том не единожды.. При этом ответных оскорблений заметьте не было... но Вас это не остановило.. Учитывая что вопрос исходил от Вас это вдвойне неприятно, и не только тому, кому предназначалось, но и другим читающим..
ну так не удивительно.. и многие другие не ответили, потому что в такое спасибо никому даром не надо.. Сути не меняет, ибо сей вопрос исходил от Вас.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
все что я хотел сказать этим ответом:
![]() так это то, что смысл в pthread_cancel() переоценен, а порой его просто нет. второе. этим ответом я дал направление почитать доку по pthread_cancel(). ![]() а дальше понеслось... Добавлено через 4 минуты и 29 секунд а в том, что в аббревиатуре "RTFM" есть якобы что-то оскорбительное - это не ко мне. не я ее придумал. и не я ввел "канон" на использование этой аббревиатуры в подобных ситуациях. но, соглашусь с тем, что аббревиатура свою роль выполняет. коротко и ясно! |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
boostcoder, ты мои посты вообще читал? может хватит выдирать цитаты из контекста?
ответа нет.. удачи тебе.. -------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
mes, вопрос был - почему считается безопасным оставлять рабочими дочерние потоки перед выходом? pthread_cancel() был предложен как один из способов завершения потока, причем здесь вообще эта функция? -------------------- undefined |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
а я вижу иначе :
подсказка :
в общем boostcoder пытался обратить ваше внимание на неправильно поставленный Вами акцент над выражением "нужно, используя pthread_cancel()".. Это сообщение отредактировал(а) mes - 11.3.2011, 10:34 |
||||||||
|
|||||||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
почему считается безопасным оставлять рабочими дочерние потоки перед выходом?
-------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
значит потоки нужно тушить перед выходом? -------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
развели тут...
fish9370, если Вас действительно интересует ответ, создайте тему |
|||
|
||||
| fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
бла-бла-бла..
no comments -------------------- undefined |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
mes, та ладно...
мне вот непонятно, почему адрес метода не является constexpr. сейчас тему создам. опять о том же |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
выражение "не нужно" само за себя не говорит - я его понял именно так.. и все время так и понимал, а причем здесь pthread_cancel() это не ко мне.. -------------------- undefined |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
а я уж чуть прям здесь не ответил Добавлено через 3 минуты и 58 секунд
не нужно имеет и второй смысл, более выраженный в том контексте "не _нужно_",т.е противопоставление вашему нужно.. и касалось не всей цитаты, а только выделенной ее части, в которой нужно относилось именно к pthread_cancel().. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
ребята, давайте спокойнее
я считаю так если поток[и] используют ресурсы, которые надо _явно_ освобождать, то, естественно, вызов pthread_cancel(), как одно из решений, необходим примеры ресурсов: классические ipc типа семафоров и shared memory, временные файлы и т. д. все, что не входит в этот список, закрывается автоматически (когда выходим из main() и завершается основной процесс) но, имхо, лучше стараться всегда завершать все явно, по-православному ;) даже если утечек быть не может Добавлено через 2 минуты и 42 секунды а что, как раз самое правильное решение, имхо -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |