Незаконный поиск в pthread_cancel

У меня есть программа, которая пытается использовать создание и отмена через реализованный пул.

Создание выглядит следующим образом:

int threadsNum=10;
while (created<threadsNum){
pthread_t newThread;
pthread_struct *st; //Open the thread that handle the deleting of the sessions timeout.
st = (pthread_struct*)malloc(sizeof(pthread_struct));
st->id = created;
st->t = newThread;
pthread_mutex_lock( &mutex_threadsPool );
readingThreadsPool[created] = st;
pthread_mutex_unlock( &mutex_threadsPool );
if((threadRes1 = pthread_create( &newThread, NULL, pcapReadingThread, (void*)created)))
{
syslog(LOG_CRIT, "Creating Pcap-Reading Thread %d  failed.",created);
printf( "Creating Pcap-Reading Thread %d  failed.\n",created);
exit(1);
}
syslog(LOG_INFO, "Created Pcap-Reading Thread %d Successfully.",created);
created++;
}

Позже я пытаюсь их отменить и перезапустить:

    pthread_t t;
pthread_struct* tstr;
int i;
pthread_mutex_unlock( &mutex_threadsPool );
//first go on array and kill all threads
for(i = 0; i<threadsNum ; i++ ){
tstr = readingThreadsPool[i];
if (tstr!=NULL){
t = tstr->t;
if (pthread_cancel(t)!=0){
perror("ERROR : Could not kill thread");
}
else{
printf("Killed Thread %d \n",i);
}
}
}

Пока все хорошо, но единственная проблема заключается в том, что выход
Ошибка: не удалось убить поток: незаконный поиск
Убитая нить 1

Убитая нить 2

Убитая нить 3

Убитая нить 4

Убитая нить 5

Убитая нить 6

Убитая нить 7

Убитая нить 8

Убитая нить 9

Почему это не убивает поток в индексе 0 также?

И я не мог найти ничего о незаконном поиске ..

Спасибо за помощь людям

Спасибо

0

Решение

Проблема в том, что newThread используется до его инициализации:

pthread_t newThread;
pthread_struct *st;
st = (pthread_struct*)malloc(sizeof(pthread_struct));
st->id = created;
st->t = newThread;

но newThread не получает значение до тех пор, пока после успешного вызова pthread_create(), Похоже, что newThread переменная сохраняет свое предыдущее значение на последующих итерациях цикла, что приводит к корректной отмене всех потоков, кроме последнего запущенного потока, так как его идентификатор никогда не вставляется в readingThreadsPool массив.

Вам нужно заполнить st->t член после звонка pthread_create(),

Поскольку код в настоящее время стоит, возможно, что запись будет вставлена ​​в readingThreadsPool массив, хотя на самом деле это еще не поток. Поместите логику вставки после вызова pthread_create():

if((threadRes1 =
pthread_create(&(st->t), NULL, pcapReadingThread, (void*)created)))
{
syslog(LOG_CRIT, "Creating Pcap-Reading Thread %d  failed.",created);
printf( "Creating Pcap-Reading Thread %d  failed.\n",created);
exit(1);
}
pthread_mutex_lock( &mutex_threadsPool );
readingThreadsPool[created] = st;
pthread_mutex_unlock( &mutex_threadsPool );

или если pcapReadingThread() доступ к функциям readingThreadsPool и ожидает запись для себя (которую я считать может быть в связи с created передается), затем приложите pthread_create() внутри замка mutex_threadsPool,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector