Theards mit Rückgabe



  • Guten Abend

    Ich habe ein Problem:
    Ich hab mir ein Programm geschrieben das ein theard benutzt.. im theard ist eine endlosschleife die solange auf einer Tasteneingabe wartet oder auch mehrere annimmt bis der theard terminiert wird. Nun würde ich gere zwischen durch (also mit jedem schleifen um lauf) einen Variablen Wert an meine Main-Funktion übergeben.
    Wie mach ich das?

    MFG Willy_Wonka 🙂



  • Shared Memory. Und da kommen die Probleme mit Threads. 😉

    Du willst aus beiden Threads auf den gleichen Speicher zugreifen, schön. Nur gibt es da Probleme, weil ein Thread irgendwo angehalten werden kann und zum anderen springen und dir so sehr viele Fallen stellen. Dagegen gibt es verschiedene Methoden das zu verhindern. Z.B Locking.



  • Danke schonmal. Habe mir das mit dem locking durch gelesen aber verstehe noch nicht warum es da probleme geben soll.

    Ich erkläre nochma meine Situation anhand eines codes:

    ...
    DWORD WINAPI theard1(LPVOID parameter)
    {
    	int temp;
    
    	int OperationSpeed;
    
    	while(true)	//Eine Endlosschleife:
    	{
    		if((temp=_getch())==43)	//IF Taste "Pfeil Oben"...
    		{
    			OperationSpeed+=100;			//... +100 ms
    		}
    
    		if((temp=_getch())==45)	//IF Taste "Pfeil Unten"...
    		{
    			OperationSpeed-=100;			//... -100 ms
    		}
    	}
    }
    
    void main()
    {
            int time;
    
    	CreateThread(NULL, 0, theard1, NULL, 0, NULL);
    
            while(true)
            {
                    time = //Time soll gleich dem OperationSpeed in dem theard sein
    	        Sleep(time)
            }
    
    }
    ...
    

    Ich weiss, dass mein Beispiel hier sehr unsauber ist aber es soll ja auch grade ist einer minute gecodet 😃



  • Solange nur jemand schreiben darf und die restlichen lediglich lesen, dann ist das auch kein Problem. Die Probleme kommen, sobald 2 Thredas auf etwas schreiben müssen.



  • Achsoo ne es ist nur so das der eine Theard schreibt. Aber wie kann ich das machen? Durch zeiger oder wie?



  • Ja, zum Beispiel. Du kannst einen Zeiger ja übergeben..

    z.B hier:
    http://www.geocities.com/samuel_super_camel/MultiThreadingTutorial.htm

    Sonst such mal nach WinAPI Multithreading tutorials in google.. Da findest du bestimmt noch viel mehr nüztliches..



  • Vielen Danke hab es direkt gelöst 😃



  • drakon schrieb:

    Solange nur jemand schreiben darf und die restlichen lediglich lesen, dann ist das auch kein Problem. Die Probleme kommen, sobald 2 Thredas auf etwas schreiben müssen.

    meeeeep! Falsch!
    Es kann auch dann zu Problemen kommen, wenn nur einer liest & einer schreibt. Siehe z. B. Producer-Consumer Probleme! Ausnahme: denn du kannst garantierten dass Read- & Wite-Operationen atomar sind und die Chaches zu jeder Zeit synchronisiert sind. Aber in der Regel kannst du das nicht.

    Chache-Inkohaerenzen sind im Beispiel vom OP vermutlich nicht so tragisch, und wenn er wirklich nur ints schreibt, muesste es auf x86 auch keine Probleme geben, da 32bit Reads/Writes auf der Architektur (afaik) atomar sind. Im Allgemeinen ist das allerdings mitnichten garantiert!

    Sobald 2 Threads auf gemeinsamen Speicher zugreifen, sind Mutexe bzw. Critical Regions Pflicht, es sei denn man weiss 100%ig genau was man tut und braucht jede Nanosekunde an Performance. In der Regel ist das aber beides nicht der Fall.



  • Blue-Tiger schrieb:

    drakon schrieb:

    Solange nur jemand schreiben darf und die restlichen lediglich lesen, dann ist das auch kein Problem. Die Probleme kommen, sobald 2 Thredas auf etwas schreiben müssen.

    meeeeep! Falsch!
    Es kann auch dann zu Problemen kommen, wenn nur einer liest & einer schreibt. Siehe z. B. Producer-Consumer Probleme! Ausnahme: denn du kannst garantierten dass Read- & Wite-Operationen atomar sind und die Chaches zu jeder Zeit synchronisiert sind. Aber in der Regel kannst du das nicht.

    Das hier wäre aber nicht wirklich ein Fall von typischem Producer-Consumer, denn es wird ja nichts aus einem Buffer genommen, sondern lediglich gelesen, was an dieser Stelle steht und nichts entfernt. Was das ist hat gar keinen Einfluss.
    Das einzige, was da ja Probleme bereiten könnte, was ich mir vorstellen kann und du wahrscheinlich meinst, wenn ich dich richtig verstanden habe ist, wenn während dem Lesen der Thread unterbrochen wird, was dann natürlich auch blöde enden könnte, verstehe ich dich richtig?



  • Was ist ein theard??



  • thread schrieb:

    Was ist ein theard??

    Ein Thread (gemeinhin als "Fred" bekannt) ist ein Thema in einem Forum.
    Der erste Post (= Eintrag) kommt vom TO ("Theo" = Thread Opener). Meistens folgen viele Posts von vielen verschiedenen Menschen die sich für die Thematik interessieren.

    Falls du was anderes gemeint hast (threads beim Programmieren) wäre der Wikipediaartikel sicher für dich von Interesse.



  • drakon schrieb:

    Blue-Tiger schrieb:

    drakon schrieb:

    Solange nur jemand schreiben darf und die restlichen lediglich lesen, dann ist das auch kein Problem. Die Probleme kommen, sobald 2 Thredas auf etwas schreiben müssen.

    meeeeep! Falsch!
    Es kann auch dann zu Problemen kommen, wenn nur einer liest & einer schreibt. Siehe z. B. Producer-Consumer Probleme! Ausnahme: denn du kannst garantierten dass Read- & Wite-Operationen atomar sind und die Chaches zu jeder Zeit synchronisiert sind. Aber in der Regel kannst du das nicht.

    Das hier wäre aber nicht wirklich ein Fall von typischem Producer-Consumer, denn es wird ja nichts aus einem Buffer genommen, sondern lediglich gelesen, was an dieser Stelle steht und nichts entfernt. Was das ist hat gar keinen Einfluss.

    Nein, das ist kein typisches Producer/Consumer Problem. Ich wollte nur dem "solange nur jemand schreiben und alle anderen lesen, kann nix passieren" wiedersprechen. Denn genau das passiert bei P/C - Situationen, und bekanntermassen kann da einiges schief gehn 🙂

    Das einzige, was da ja Probleme bereiten könnte, was ich mir vorstellen kann und du wahrscheinlich meinst, wenn ich dich richtig verstanden habe ist, wenn während dem Lesen der Thread unterbrochen wird, was dann natürlich auch blöde enden könnte, verstehe ich dich richtig?

    Genau, wenn ein Thread mitten im Schreiben oder im Lesen unterbrochen wird (d.h. wenn die Reads bzw. die Writes nicht atomar sind), dann kann das ordentlich in die Hose gehen. Wird wie gesagt beim Verwenden von int auf einer x86-Maschine nicht passieren (Reads/Writes von ints sind bei x86 AFAIK atomar), aber im Allgemeinen ist das nicht der Fall (bei einem long long z.B. sind R/W meines Wissens schon nicht mehr atomar), weswegen der Threadersteller sich das lieber nicht so angewoehnen sollte.



  • (Reads/Writes von ints sind bei x86 AFAIK atomar)

    Nein, sind sie nicht! Garnichts ist garantiert atomar bei x86 ausser vielleicht Compare-and-Swap. Extrembeispiel: Was ist wenn der int ausgelagert ist?



  • franz schrieb:

    thread schrieb:

    Was ist ein theard??

    Ein Thread (gemeinhin als "Fred" bekannt) ist ein Thema in einem Forum.
    Der erste Post (= Eintrag) kommt vom TO ("Theo" = Thread Opener). Meistens folgen viele Posts von vielen verschiedenen Menschen die sich für die Thematik interessieren.

    Falls du was anderes gemeint hast (threads beim Programmieren) wäre der Wikipediaartikel sicher für dich von Interesse.

    trolled.



  • knivil schrieb:

    (Reads/Writes von ints sind bei x86 AFAIK atomar)

    Nein, sind sie nicht! Garnichts ist garantiert atomar bei x86 ausser vielleicht Compare-and-Swap. Extrembeispiel: Was ist wenn der int ausgelagert ist?

    Na ja, solange er nicht direkt beim Schreiben unterbrochen wird, ist das ja immer noch atomar: Zu jedem Zeitpunkt hat der int entweder noch den alten Wert oder den Neuen (EDIT: und x86-Dualcores haben Cache-Cohaerenz, also sehen beide Threads entweder den alten oder beide den neuen Wert). Oder seh ich das falsch?



  • franz schrieb:

    Der erste Post (= Eintrag) kommt vom TO ("Theo" = Thread Opener).

    TO?
    Wenn dann bitte OP (= Original Pos(t)er).



  • Ist es normal bei theards das meine auslasstung beim öffnen eines Theards direkt auf 99% geht?



  • Willy_Wonka schrieb:

    Ist es normal bei theards das meine auslasstung beim öffnen eines Theards direkt auf 99% geht?

    when du eine Endlosschleife (mit Busy waiting) drin hast, die unnoetig CPU verbraet (so wie im Code, den du gepostet hast): ja. Normalerweise aber nicht, nein.



  • Willy_Wonka schrieb:

    Ist es normal bei theards das meine auslasstung beim öffnen eines Theards direkt auf 99% geht?

    Dafür (oder besser dagegen) gibt es z.B unter Windows Sleep

    http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx

    @Blue-Tiger:
    OK. Dankeschön.



  • Blue-Tiger schrieb:

    Na ja, solange er nicht direkt beim Schreiben unterbrochen wird, ist das ja immer noch atomar: Zu jedem Zeitpunkt hat der int entweder noch den alten Wert oder den Neuen

    Ja.
    Aber wenn du Pech hast siehst du nie den neuen Wert 😉

    Fuer sowas eignet sich Compare and Swap - kann man schoen in eine atomic Klasse packen. Siehe zB die implementierung von boost shared_ptr.


Anmelden zum Antworten