У меня есть программа, которая пытается использовать создание и отмена через реализованный пул.
Создание выглядит следующим образом:
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 также?
И я не мог найти ничего о незаконном поиске ..
Спасибо за помощь людям
Спасибо
Проблема в том, что 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
,
Других решений пока нет …