Код ошибки pthread_join 3

у меня проблема в моем проекте. мне выдает код ошибки 3.

Я просто добавляю часть своего кода, чтобы вы видели, что я сделал. в main.cpp, который я объявил в потоках, я отправляю в initRequestThreads(в thread.h) для создания потоков. затем в main.cpp я позволяю основному процессу ждать его.

main.cpp

pthread_t *requestersThreads = new pthread_t[Length_Tasks];
requestsPool->initRequestThreads(&requestersThreads);
void*  status;


// wait for all requests threads
for(t=0; t<Length_Tasks; t++) {
    rc = pthread_join(requestersThreads[t], &status);
    if (rc) {
        cout<<"ERROR; return code from pthread_join() is "<< rc <<endl;
        exit(-1);
    }
    cout<<"Main: completed join with REQUEST thread " << t <<" having a status of "<<(long)status<<endl;
}

// wait for all resolvers threads
for(t=0; t<resolveThreadsAmount; t++) {
    rc = pthread_join(reoslveThreads[t], &status);
    if (rc) {
        cout<<"ERROR; return code from pthread_join() is "<< rc <<endl;
        exit(-1);
    }
    cout<<"Main: completed join with RESOLVER thread " << t <<" having a status of "<<(long)status<<endl;
}


delete[] tasks;
delete[] TaskQueueRequests;
delete[] TaskQueueResolves; 
//delete[] requestersThreads;
//delete[] reoslveThreads;

pthread_mutex_destroy(&TaskQueueResolves_lock);
pthread_cond_destroy(&TaskQueueResolves_cond);

ThreadPool.h

        void initRequestThreads(pthread_t **threads)
    {

        // add the attribute join for the threads
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

        int rc;

        cout << "DEBUG "<< __LINE__<<": numOfThreads:"<<numOfThreadsRequests<<endl;
        for(long i = 0; i < numOfThreadsRequests; i++)
        {   
            threads[i] =  new pthread_t;
            rc = pthread_create(&(*threads[i]), &attr, ThreadPool::OperationRequestThread, (void *)this);  // create thread that get all the thread pool object(this) and preform OperationRequest function
            if(rc)
            {
                cout <<"creating Request thread failed! Error code returned is:"+rc<<endl;
                exit(-1);
            }
            cout << "DEBUG "<< __LINE__<<": Creating Request Thread #" << i+1 << "!\n";
        }

        pthread_attr_destroy(&attr);

}


person Manspof    schedule 18.05.2017    source источник
comment
Вы проверяли возвращаемое значение pthread_join на количество ошибок (EINVAL, ....), это поможет вам больше, чем просто необработанное значение ошибки. Ваш код представляет собой беспорядок C и C++. Попробуйте очистить его (используйте vector вместо T*, ...)   -  person nefas    schedule 18.05.2017


Ответы (1)


Вы получаете код ошибки ESRCH, что означает, что поток, к которому вы пытаетесь присоединиться, не существует.

И причина этого в ужасном беспорядке неопределенного поведения в вашем коде в отношении того, как вы обрабатываете идентификаторы потоков.

pthread_t *requestersThreads = new pthread_t[Length_Tasks];

Это создает массив из N потоков, и вы передаете указатель на этот массив своей функции в

initRequestThreads(&requestersThreads);

Теперь, в цикле создания вашего потока, вы делаете

threads[i] =  new pthread_t;
pthread_create(&(*threads[i]), &attr /*... */

Здесь вы полностью испортите свой массив и вызовете неопределенное поведение. В вашей функции threads не является массивом! Это адрес массива. Вы не можете получить к нему доступ с помощью array subscript operator ([]). А остальное лишь добавляет оскорбления к уже случившейся здесь травме.

Если вы пишете на С++ 11 и выше (как и положено в 2017 году), вам следует использовать С++ 11 std::thread. Если вы по какой-то причине привязаны к C++2003, вы должны по крайней мере прекратить это ужасное дело с динамическими массивами и передачей указателя на них, а вместо этого использовать std::vector<pthread_t> в качестве выходного параметра вашей функции.

person SergeyA    schedule 18.05.2017
comment
это то, что я сделал человек. Я не вижу, что не так. в любом случае, я не могу использовать вектор, потому что это задание. это все еще не работает - person Manspof; 18.05.2017