Parameter wird an Threads übergeben aber zu oft verarbeitet



  • hi,

    ich lese eine datei aus, und starte dann threads, die den eingelesenen string verarbeiten sollen.

    for(int i = 0; i<inputThreads;i++)
    			{
    
    			bread = inputfile.ReadString(str);
    
    hThread[index] = CreateThread( NULL, 
                                      0, 
                                      OpenRemoteFile, 
    									&str, 
                                      0, 
                                      &dwThreadID[index]
                                     ); 
    
    WaitForMultipleObjects(index, 
    						hThread, 
                            TRUE, 
                            m_timeout+5000); // Wait for Threads
    
    }
    

    DWORD WINAPI OpenRemoteFile(LPVOID Data)
    {

    CString rmtAdress = *(CString *)Data;
    ....
    //verarbeitung

    hier wird der string in ein file geschrieben, aber mehrmals
    }

    mein problem ist, dass in dem outputfile mehrmals das gleiche vorkommt, obwohl das ja eig nicht sein dürfte.

    Weiß jmd woran das liegen könnte? (abgesehen von dem miserablen coding^^)



  • Das liegt daran, dass du jedem Thread die Adresse desselben Strings übergibst. Was passiert wohl, wenn du den nächsten String aus der Datei liest, bevor der Thread Gelegenheit hatte, den Inhalt zu kopieren?



  • aber ich hab in der for-schleife doch WaitForMultipleObjects drin.
    also müsste er doch warten oder nicht?

    // wie würdest du das lösen?



  • ich hab nen weg gefunden.

    nach dem thread aufruf setze ich einfach sleep. in der zeit ist es im thread schon in eine andere variable kopiert 🙂



  • Ja so geht es auch. 👎

    Warum syncronisierst du die Threads nicht so wie es sich gehört.



  • ich hab nen weg gefunden.
    nach dem thread aufruf setze ich einfach sleep. in der zeit ist es im thread schon in eine andere variable kopiert

    Schreib' bitte auf jedes Programm schön deutlich drauf, daß es von dir ist. Nur so zur Sicherheit...
    Multithreading bekommst du nicht mit "jetzt läuft's ja" hin.

    Eine möglichkeit ist:

    - mache eine Kopie des Strings auf dem heap (Aber Achtung, CString macht keine tiefe kopie, Du nimmst strdup oder einen vector<TCHAR>, oder du weißt wie du CString zu einer tiefen Kopie zwingst)
    - gibst den allozierten Zeigen an den thread rüber
    - der Thread gibt den Zeiger wieder frei


Anmelden zum Antworten