URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 876
[ Назад ]

Исходное сообщение
"потоки... так их... ;-\"

Отправлено Taras , 05-Авг-02 13:58 
Помогите кто может... А то..

Ситуация: кто-то из нас -- тупой
--------- пример ----------
void * f(void* p)
{
while(1){}
}

void Test(void)
{
pthread_t t;
pthread_create(&t, NULL, f, NULL);
sleep(2);
pthread_canсel(t);
}
---------- конец примера --------
Каждый вызов Test(); сьедает 4к!!! Ж8-()
Нет ну я понимаю: страница для кода, страница для данных, страница для стека, страница еще для чего-то... А подчищать кто все будет?

Версию линухового ядра не вспомню сразу...  Но неужели там баг? Или все таки руки? ;-))


Содержание

Сообщения в этом обсуждении
"RE: потоки... так их... ;-\"
Отправлено Mokromax , 06-Авг-02 17:08 
ё-моё, ты чего, компьютерный гумманист чтоль ?

"RE: потоки... так их... ;-\"
Отправлено Taras , 06-Авг-02 18:05 
>ё-моё, ты чего, компьютерный гумманист чтоль ?
А поподробнее?



"RE: потоки... так их... ;-\"
Отправлено Аноним , 07-Авг-02 11:59 
>Помогите кто может... А то..
>
>Ситуация: кто-то из нас -- тупой
>--------- пример ----------
>void * f(void* p)
>{

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
/* а то они у Вас DEFERRED, и ждут cancellation point, которая
никогда не наступает */

>while(1){}
>}
>
>void Test(void)
>{
>pthread_t t;
>pthread_create(&t, NULL, f, NULL);
>sleep(2);
>pthread_canсel(t);
>}
>---------- конец примера --------
>Каждый вызов Test(); сьедает 4к!!! Ж8-()
>Нет ну я понимаю: страница для кода, страница для данных, страница для
>стека, страница еще для чего-то... А подчищать кто все будет?
>
>Версию линухового ядра не вспомню сразу...  Но неужели там баг? Или
>все таки руки? ;-))



"RE: потоки... так их... ;-\"
Отправлено Taras , 07-Авг-02 13:15 
>>Помогите кто может... А то..
>>
>>Ситуация: кто-то из нас -- тупой

Пробовал и другой не менее идеальный вариант:
>>--------- пример ----------
>>void * f(void* p)
>>{
>
>/*pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
>/ * а то они у Вас DEFERRED, и ждут cancellation point, которая
>
>никогда не наступает  
>
>>while(1){}
*/
pthread_exit(NULL);
>>}
>>
>>void Test(void)
>>{
>>pthread_t t;
>>pthread_create(&t, NULL, f, NULL);
>>sleep(2);
>>//pthread_canсel(t);
>>}
>>---------- конец примера --------
>>Каждый вызов Test(); сьедает 4к!!! Ж8-()
>>Нет ну я понимаю: страница для кода, страница для данных, страница для
>>стека, страница еще для чего-то... А подчищать кто все будет?
>>
>>Версию линухового ядра не вспомню сразу...  Но неужели там баг? Или
>>все таки руки? ;-))
Ядро 2.2.15.
А может это не глюк, что он память сразу не освобожает? Может когда мало станет освобождать начнет? Сейчас попробую. Спасибо. Ваш вариант пробовал. Ни к каким изменениям не приводит... ;-(



"RE: потоки... так их... ;-\"
Отправлено romanSA , 08-Авг-02 10:20 
Вообще-то, если у тебя потоки не отсоединённые, а по умолчанию это так, то нужно вызывать pthread_join().
До этого вызова система должна хранить состояние завершения неотсоединённого потока.

Попробуй либо вызывать pthread_join() либо отсоединять потоки вызовом pthread_detach() - может и не будет глюков.


"RE: потоки... так их... ;-\"
Отправлено Taras , 12-Авг-02 11:00 
>Вообще-то, если у тебя потоки не отсоединённые, а по умолчанию это так,
>то нужно вызывать pthread_join().
>До этого вызова система должна хранить состояние завершения неотсоединённого потока.
>
>Попробуй либо вызывать pthread_join() либо отсоединять потоки вызовом pthread_detach() - может и
>не будет глюков.
А... Хабыл в прошлый раз все написать... ;-)
Перепробаванно все!!! ;-)
Под 7,2 линухом работает тоже все! ;-)) С ядром 2.2.15 ни работает нифига!.. Может сконфигирированно как-то не так было... Но тут я уже не волшебник... ;-\


"RE: потоки... так их... ;-\"
Отправлено Soldier , 12-Авг-02 11:56 
>>Вообще-то, если у тебя потоки не отсоединённые, а по умолчанию это так,
>>то нужно вызывать pthread_join().
>>До этого вызова система должна хранить состояние завершения неотсоединённого потока.
>>
>>Попробуй либо вызывать pthread_join() либо отсоединять потоки вызовом pthread_detach() - может и
>>не будет глюков.
>А... Хабыл в прошлый раз все написать... ;-)
>Перепробаванно все!!! ;-)
>Под 7,2 линухом работает тоже все! ;-)) С ядром 2.2.15 ни работает
>нифига!.. Может сконфигирированно как-то не так было... Но тут я уже
>не волшебник... ;-\

Чтобы pthread память и ресурсы освобождал, обязательно или pthread_detach или  pthread_join надо вызвать, а то что в вашем случае это не помогает - либо случай тяжелый, либо одно из двух...