Я работал с pthreads, я создал их в массив, используя цикл for, а при этом при этом вдерены значения параметраThread [index] и conssumerThread [index] от 0 до сколь угодно большого количества пользователей (например, 3 потока в каждом).
Потоки работают правильно и вставляют / удаляют элементы при необходимости. Они находятся в бесконечном цикле while, который прерывается с использованием флага глобальной переменной (endFlag) после пробуждения main из заданного пользователем режима сна.
Моя проблема в том, что я не могу заставить потоки закрываться, в основномpthread_join (thread [index], NULL) на самом деле не проходит через любой из моих потоковых массивов, а просто зависает.
Ниже приведена функция закрытия потока, как уже упоминалось выше, потоки действительно работают и выполняют вывод, как я ожидаю, но они просто не закрываются, как я ожидаю.
Я пытался переместить pthread_join () в main (в настоящее время в функции), перемещаться по массиву в обратном направлении - по сравнению с index ++, перемещать порядок двух потоковых массивов (сначала 2, затем 1) и снова спать в main, надеясьсделайте так, чтобы у всех была возможность закончить. Все они не увенчались успехом, также многие из проблем, с которыми я сталкивался в Интернете, не совсем совпадают с тем, что я испытывал.
/*
CloseThread function takes the pointer to the start of the array for the producer and consumer, the total threads (producer and consumer) entered by user
*/
void closeThreads( pthread_t *producerThread, pthread_t *consumerThread, int producerThreadCount, int consumerThreadCount )
{
//flag to verify the thread closure
int closed = -1;
// for loop to close threads at consumerThread @ index value
for ( int index = 0; index < consumerThreadCount; index++ )
{
// pthread_join returns 0 if successful, closing the thread @ index
closed = pthread_join ( consumerThread[ index ], NULL );
// thread failed to close if closed doesnt equal 0.
if ( closed != 0 )
{
fprintf ( stderr, "Thread failed to create." );
exit ( 4 );
}//end of the failed to close issue.
}// end of consumer thread close procedure
// for loop to close the producer threads
for ( int index = 0; index < producerThreadCount; index++ )
{
// closes a thread in the array producerThread @ index value
pthread_join ( producerThread[ index ], NULL );
// unsuccessful
if ( closed != 0 )
{
fprintf ( stderr, "Thread failed to close." );
exit ( 3 );
}
}// end of join producer threads
}// end of close threads
Я должен получить соединение двух потоковых массивов. каждый поток с main, но этого не происходит, и консоль просто зависает, как будто она все еще выполняет вычисления.
EDIT: Извините, я исправил свое тестирование index-- на index ++, как это на самом деле сейчас, так или иначе оба даюттот же вопрос зависания.