pthread_create gibt 11 zurück



  • Hallo,

    in meinem Programm werden alle 2 Sekunden 10 Threads erstellt. Die Threads fragen WebAPI's ab, speichern die ausgewerteten Werte in einer Datenbank und sind dann fertig.

    (Das Ganze auf Linux Ubuntu)

    // in main()
    while(stop == false)
        {
           timestamp = time(NULL);
           Api1.runQuery((void*)timestamp);
           Api2.runQuery((void*)timestamp);
           // ... usw.
    
           usleep(2000000);
        }
    
    // runQuery Funktion 
    
    void WAPI::runQuery(void* ts)
    {
    
        struct qInfo *temp = new (struct qInfo);
        temp->tname = tableName;
        temp->tpath = Path;
        temp->ts    = (time_t)ts;
        temp->dM    = debugMode;
    
        pthread_create(&t1, NULL, (void*(*)(void*))pFunc, (void*)temp); //pFunc ist für jede Instanz von WAPI unterschiedlich, jedoch unterscheiden sich die einzelnen Funktionen nur bei der Verarbeitung der erhaltenen Daten (JSON)
    
    }
    
    // pFunc Beispiel
    
    void pFunc_Bsp(void* ts)
    {
        struct qInfo *info = (struct qInfo*)ts;
    
        CURL *curl;
        string readBuffer;
        bool parseSuccess;
    
        Json::Value root;
        Json::Reader reader;
    
        MYSQL *connection = mysql_init(NULL);
        string query;
    
        curl = curl_easy_init();
        if(curl) {
    
          curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
          curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
          curl_easy_setopt(curl, CURLOPT_URL, info->tpath.c_str());
          res = curl_easy_perform(curl);
    
          parseSuccess = reader.parse(readBuffer.c_str(), root);
          if ( !parseSuccess )
          {
              writeDebugMsg(true, info->tname, "ERROR: Failed to parse JSON");
          }
    
          double w1 = root["ABC"]["123"].asDouble();
    
          if(!mysql_real_connect(connection, "127.0.0.1", "root", "zzz","WAPI", 3306, NULL,0 ))
          {
              writeDebugMsg(debugMySQL, info->tname, "ERROR: Connection to the Database failed");
          }
    
          query = "INSERT INTO ....."; // gekürzt
    
          writeDebugMsg(info->dM, info->tname, "Query: " + query);
    
          mysql_perform_query(connection, (char *)query.c_str(), info);
    
          mysql_close(connection);
          curl_easy_cleanup(curl);
    
        }
    
    cout << "END" << endl; // Um zu sehen, ob die einzelnen Threads wirklich zuende gehen
    }
    

    Das ganze funktioniert besten, für ca. 1 Minute 😃
    Danach gibt pthread_create immer 11 zurück, was bedeutet:

    The system lacked the necessary resources to create another thread, or the system-imposed limit on the total number of threads in a process PTHREAD_THREADS_MAX would be exceeded.
    

    Dann dachte ich mir dass die Threads eventuell irgendwie "weiterleben".

    Also schaue ich in /proc/<procID>/task nach, wo für jeden laufenden Thread ein Verzeichnis erstellt wird.

    Dort kann ich nichts vorfinden, die Threads scheinen sich zu schließen. Ab dem Zeitpunkt an dem pthread_create 11 zurückgibt sind in dem Verzeichnis nur noch 2 Unterverzeichnisse vorhanden.

    So, das war jetzt eine ganzschöne Wand an Text+Code, ich hoffe ich konnte mein Problem relativ übersichtlich darstellen.
    Hat jemand von euch eine Idee woran das liegen könnte, dass keine neuen Threads erstellt werden können?

    Vielen Dank schonmal!



  • Es ist keine so gute Idee, immer weiter Threads zu erstellen. Erstell dir lieber einen Threadpool von 10-25 Threads die sich alle ihre "Aufträge" aus einer Queue holen. Diese müssen dann natürlich laufen, bis die Queue leer ist und dürfen sich nicht nach einem durchgang beenden.



  • Wenn du die Threads nicht am Ende per join beendest bleiben die als Zombies stehen.
    Oder du startest sie detached. Dann werden die Threads auch aus dem System genommen nachdem sie in deinem Code terminiert sind.

    So ungefähr.



  • Ja, das wurde mir im Nachhinein auch klar 😃 Nur wäre es jetzt ein ziemlicher Aufwand das Programm komplett umzuschreiben, da es noch größer ist als das was man hier sieht. Deswegen wär ich ziemlich froh, wenn jemand das Problem hier finden könnte 🙂

    // Edit: Danke simbad, werde ich gleich mal probieren
    Funktioniert, vielen Dank 🙂


Anmelden zum Antworten