2017-05-18 1 views
0

Ich habe ein Problem in meinem Projekt. wirft es mir Fehlercode 3.pthread_join Fehlercode 3

Ich füge nur einen Teil meines Codes, damit Sie sehen, was ich getan habe. in main.cpp ich für die Threads deklariert dann sende ich an initRequestThreads (in thread.h), um die Threads zu erstellen. dann lasse ich in main.cpp den Hauptprozess darauf warten.

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

}

+0

haben Sie den Rückgabewert von '' pthread_join'' gegen die Fehlernummer ('' EINVAL'', ....) getestet, es würde Ihnen mehr als nur den rohen Fehlerwert helfen. Ihr Code ist ein Durcheinander von C und C++. Versuchen Sie, es aufzuräumen (verwenden Sie '' vector'' anstelle von '' T * '', ...) – nefas

Antwort

2

Der Fehlercode Sie bekommen ist ESRCH - was bedeutet, fädeln Sie tut zu verbinden versuchen nicht, existieren.

Und der Grund dafür ist die schreckliche Unordnung von undefined Verhalten in Ihrem Code in Bezug auf wie Sie mit Thread-IDs umgehen.

pthread_t *requestersThreads = new pthread_t[Length_Tasks]; 

Dies erzeugt eine Reihe von N Threads und als Sie einen Zeiger auf dieses Array auf Ihre Funktion in

initRequestThreads(&requestersThreads); 

nun in der Thread-Erzeugung Schleife vorbei, Sie tun

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

Hier verwirren Sie Ihr Array völlig und lösen undefiniertes Verhalten aus. In Ihrer Funktion ist threads kein Array! Es ist eine Adresse des Arrays. Sie können nicht mit array subscript operator ([]) darauf zugreifen. Und der Rest ist nur eine Beleidigung für eine bereits geschehene Verletzung.

Wenn Sie C++ 11 und höher (wie in 2017) schreiben, sollten Sie C++ 11 std::thread verwenden. Wenn Sie aus irgendeinem Grund an C++ 2003 gebunden sind, sollten Sie zumindest diese schreckliche Angelegenheit von dynamischen Arrays stoppen und einen Zeiger an diese übergeben und stattdessen std::vector<pthread_t> als Ausgabeparameter für Ihre Funktion verwenden.

+0

das ist, was ich tat man. Ich sehe nicht, was falsch ist. Wie auch immer, ich kann keinen Vektor benutzen, weil das die Aufgabe ist. es funktioniert immer noch nicht –

Verwandte Themen