Threads und Übergabeparameter



  • Hi,

    habe unter Verwendung von process.h einen Thraed erzeugt. Der Prototyp sieht so aus: void threadfunction (void *dummy);, der Start des Threads so: _beginthread(threadfunction, 0, NULL);. Hat auch alles soweut funktioniert. Nun meine Fragen:
    1. Ist es möglich der Funktion threadfunction weitere Übergabeparamter mitzugeben?

    2. Kann man die erzeugten Threads irgendwie mit Prioritäten versehen?

    Vielen Dank



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sorry, hab nicht gewusst, dass ich das falsche Forum erwischt hatte. Gehört die process.h zur Windowsprogrammierung, hatte eine reine Konsolenanwendung erstellt und gehofft ich bin noch im ANSI-Standard



  • _beginthread liefert einen Handle auf den neu erstellten Thread. Diesem Thread kann nun eine Priorität zugewiesen werden:

    SetThreadPriority(hThread,THREAD_PRIORITY_BELOW_NORMAL);
    

    Die Doku dafür ist hier.
    ( THREAD_PRIORITY_HIGHEST bei der Entwicklung nur verwenden, wenn du einen Reset-Knopf am Rechner hast)



  • > 1. Ist es möglich der Funktion threadfunction weitere Übergabeparamter mitzugeben?

    Übergib doch ein Array, dessen Größe bekannt ist. Oder einen Pointer auf eine Struct.



  • Oh, Frage 1 hab' ich irgendwie komplett übersehen...



  • Wenn es wirklich eine Konsolenanwendung ist wäre der Systemaufruf CreateThread() eine gute Wahl, da man den Thread dort zunächst erzeugen kann ohne das er sofort losläuft (CREATE_SUSPENDED). Danach Kann man die Thread Prio setzen.

    Ausserdem würde ich für reproduzierbare Ergebnisse auch die BasisPrio für den gesammten Prozess setzen mit SetPriorityClass().

    Parameterübergabe als Zeiger auf irgendwas ist ok.


  • Mod

    Nein! Bei Verwendung der CRT ist CreateThread niemals eine gute Wahl!



  • Martin Richter schrieb:

    Nein! Bei Verwendung der CRT ist CreateThread niemals eine gute Wahl!

    Solange man nicht mit gewissen CRT - Globalen Variablen zu arbeiten gedenkt (die beginthreadex für jeden Thread separat allokieren würde) (errno o.ä.) sollte man auch unbedenklich mit CreateThread()-Funktionen die CRT nutzen können (ohne deshalb irgendwelche Speicherlecks zu riskieren).

    Mit einer Fehlfunktion der CRT-Funktionen ist auf gar keinen Fall zu rechnen,
    wenn man statt beginthreadex() mit CreateThread() arbeitet, siehe dazu auch:

    The "Programming Techniques" manual supplied with Visual C++ 32-bit Edition states that using CreateThread() in a program that uses Libcmt.lib causes many CRT functions to fail. Actually, the only function that should not be used in a thread created with CreateThread() is the signal() function.
    *
    -->
    http://msdn.microsoft.com/en-us/library/ms682608(VS.85).aspx

    Insgesamt finde ich es konsistenter, mit den Funktionen einer API zu arbeiten, also dass man nicht z.B. beginthreadex() mit EnterCriticalSection(), WaitForSingleObject() u.ä. bunt mischen sollte. Wenn ich mit den beiden letzteren Funktionen arbeiten möchte, dann werde ich mir meinen Thread auch stets mit CreateThread() anlegen (und selbigen mit ExitThread() beenden).
    Oft genug benötigt man auch in einem Thread keinen einzigen CRT-Aufruf.
    Auch für die Auflösung irgendwelcher globaler Symbole braucht man keine CRT, sondern dazu genügt der PE-Loader.

    MFG



  • CreateThread ist auch kein Problem, so lange Du den Thread mit _endthread beendest.



  • Mit einer Fehlfunktion der CRT-Funktionen ist auf gar keinen Fall zu rechnen...

    Die MSDN schreibt dazu (zu CreateThread):

    A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread;

    Damit ist eigentlich alles gesagt...
    PS: CreateThread und _endthread find' ich auch nicht sonderlich hübsch...


Anmelden zum Antworten