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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.