Pthread_join () висит на массиве потоков - PullRequest
0 голосов
/ 05 ноября 2019

Я работал с 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 ++, как это на самом деле сейчас, так или иначе оба даюттот же вопрос зависания.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Моя проблема закончилась тем, что я вырвался из цикла while, я не использовал:

sem_post(&semaphore);

Это позволило правильно закрыть потоки.

0 голосов
/ 05 ноября 2019

Ваши циклы, такие как:

for ( int index = 2; index < consumerThreadCount; index-- )

Вероятно, должно быть:

for ( int index = 0; index < consumerThreadCount; ++index )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...