pthread_join error code 3

2019-09-16 18:49发布

问题:

i have problem in my project. it throws me error code 3.

I just add part of my code to let you see what I did. in main.cpp I declared on the threads then I send to initRequestThreads(in thread.h) to create the threads. then in main.cpp i let the main process to wait for it.

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);

}

回答1:

The error code you are getting is ESRCH - which means, thread you are trying to join doesn't exist.

And the reason for that is the terrible mess of undefined behavior in your code in regards to how you handle thread ids.

pthread_t *requestersThreads = new pthread_t[Length_Tasks];

This creates an array of N threads, and than you are passing a pointer to this array to your function in

initRequestThreads(&requestersThreads);

Now, in your thread creation loop, you do

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

Here you completely mess up your array and trigger undefined behavior. In your function, threads is not an array! It is an address of the array. You can't access it with array subscript operator ([]). And the rest is just adding insult to an injury already happened here.

If you are writing C++11 and above (as you should in 2017) you should use C++11 std::thread. If you for some reason are bound to C++2003, you should at least stop this terrible business of dynamic arrays and passing a pointer to those, and instead use std::vector<pthread_t> as an output parameter to your function.