Пример в конце письма падает в строке с тегом !!!
Подскажите, это ожидаемое поведение, в соответствии с дизайном phtreads?
Логика для меня совсем не понятная, такое впечатление, что id потока через какое-то количество операций с потоками становится запрещенным для использования.
Вместо pthread_kill можно использовать любую другую функцию, которая хочет на вход pthread_t, результат будет таким же.
система Red Hat Enterprise Linux AS release 4 Update 7
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
}
Похоже, это баг 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
Здравствуйте, ДимДимыч, Вы писали: ДД>После pthread_join() дескриптор нити уже не валиден. Что pthread_kill() не падает в первом случае — вам просто повезло.
Здравствуйте, 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.
ДД>>После pthread_join() дескриптор нити уже не валиден.
F>а почему?. F>вернее, зачем так?.
ну а как ты будешь обрабатывать процесс когда треды очень часто порождаются и джойнятся? Если ты хочешь оставлять дескриптор нити валидным после джойна, то тебе придется выдавать уникальные id всем тредам, значит усложнять реализацию.
Здравствуйте, neFormal, Вы писали:
R>>>Пример в конце письма падает в строке с тегом !!! ДД>>После pthread_join() дескриптор нити уже не валиден.
F>а почему?. F>вернее, зачем так?.
Чтобы не занимать ресурсы системы, когда нить уже завершена и код возврата получен (или проигнорирован).
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)