pthread_* crash если pthread_t 'устарел'
От: render  
Дата: 15.07.10 12:40
Оценка:
Пример в конце письма падает в строке с тегом !!!
Подскажите, это ожидаемое поведение, в соответствии с дизайном phtreads?
Логика для меня совсем не понятная, такое впечатление, что id потока через какое-то количество операций с потоками становится запрещенным для использования.
Вместо pthread_kill можно использовать любую другую функцию, которая хочет на вход pthread_t, результат будет таким же.
система Red Hat Enterprise Linux AS release 4 Update 7


#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>


void* thread(void*)
{
return 0;
}

int main(int argc, char* argv[])
{
const size_t size = 300;
// case 1
for (size_t i = 0; i < size; ++i)
{
pthread_t id;
pthread_create(&id, 0, thread, 0);
pthread_join(id, 0);
pthread_kill(id, 0);
}

// case 2
pthread_t* id = new pthread_t[size];
for (size_t i = 0; i < size; ++i)
{
pthread_create(&id[i], 0, thread, 0);
}

for (size_t i = 0; i < size; ++i)
{
pthread_join(id[i], 0);
}

for (size_t i = 0; i < size; ++i)
{
printf("Trying pthread_kill on %x \n", id[i]);
pthread_kill(id[i], 0);// !!! CRASH SIGSEGV inside of pthread_kill for i==0
}

delete [] id;
return 0;
}
Re: pthread_* crash если pthread_t 'устарел'
От: ДимДимыч Украина http://klug.org.ua
Дата: 15.07.10 13:53
Оценка:
Здравствуйте, render, Вы писали:

R>Пример в конце письма падает в строке с тегом !!!


После pthread_join() дескриптор нити уже не валиден. Что pthread_kill() не падает в первом случае — вам просто повезло.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: pthread_* crash если pthread_t 'устарел'
От: asergeev  
Дата: 15.07.10 13:57
Оценка:
Похоже, это баг pthreads (https://bugzilla.redhat.com/show_bug.cgi?id=151502)
вместо того, что бы завершиться с кодом ESRCH функции pthreads крешатся на недействительных дескрипторах.
После pthread_join дескриптор становиться недействительным.

Здравствуйте, render, Вы писали:

R>Пример в конце письма падает в строке с тегом !!!

R>Подскажите, это ожидаемое поведение, в соответствии с дизайном phtreads?
R>Логика для меня совсем не понятная, такое впечатление, что id потока через какое-то количество операций с потоками становится запрещенным для использования.
R>Вместо pthread_kill можно использовать любую другую функцию, которая хочет на вход pthread_t, результат будет таким же.
R>система Red Hat Enterprise Linux AS release 4 Update 7
Re[2]: pthread_* crash если pthread_t 'устарел'
От: render  
Дата: 16.07.10 07:00
Оценка:
Здравствуйте, ДимДимыч, Вы писали:
ДД>После pthread_join() дескриптор нити уже не валиден. Что pthread_kill() не падает в первом случае — вам просто повезло.

Да, похоже так и есть. Спасибо.
Re[2]: pthread_* crash если pthread_t 'устарел'
От: render  
Дата: 16.07.10 07:12
Оценка:
Здравствуйте, asergeev, Вы писали:

A>Похоже, это баг pthreads (https://bugzilla.redhat.com/show_bug.cgi?id=151502)

A>вместо того, что бы завершиться с кодом ESRCH функции pthreads крешатся на недействительных дескрипторах.
A>После pthread_join дескриптор становиться недействительным.
Да, и по стандарту должна быть ошибка при вызове pthread_kill c невалидным дескриптором, но, к сожалению, падает.

The pthread_kill() function shall fail if:
[ESRCH]
No thread could be found corresponding to that specified by the given thread ID.
Re[2]: pthread_* crash если pthread_t 'устарел'
От: neFormal Россия  
Дата: 19.07.10 14:56
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

R>>Пример в конце письма падает в строке с тегом !!!

ДД>После pthread_join() дескриптор нити уже не валиден.

а почему?.
вернее, зачем так?.
...coding for chaos...
Re[3]: pthread_* crash если pthread_t 'устарел'
От: dilmah США  
Дата: 19.07.10 15:08
Оценка:
ДД>>После pthread_join() дескриптор нити уже не валиден.

F>а почему?.

F>вернее, зачем так?.

ну а как ты будешь обрабатывать процесс когда треды очень часто порождаются и джойнятся? Если ты хочешь оставлять дескриптор нити валидным после джойна, то тебе придется выдавать уникальные id всем тредам, значит усложнять реализацию.
Re[3]: pthread_* crash если pthread_t 'устарел'
От: ДимДимыч Украина http://klug.org.ua
Дата: 19.07.10 16:38
Оценка:
Здравствуйте, neFormal, Вы писали:

R>>>Пример в конце письма падает в строке с тегом !!!

ДД>>После pthread_join() дескриптор нити уже не валиден.

F>а почему?.

F>вернее, зачем так?.

Чтобы не занимать ресурсы системы, когда нить уже завершена и код возврата получен (или проигнорирован).
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.