Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 01:19

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Multithreading

Discussion on Multithreading within the C/C++ forum part of the Coders Den category.

Reply
 
Old 09/29/2012, 19:21   #16
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
if (!hThread || !dwThreadID)
return 1;
Wofür ist dieser if Befehl?
if hThread nicht und dwThreadID nicht wiederhole
Ich verstehe nicht was diese anweisung bezwecken soll und außerdem wäre es noch nett wenn mir jmd erklären könnte warum hier bei return eine 1 gesetzt wird kenne es bis jetzt nur mit einer 0 ?

Quote:
Originally Posted by .SkyneT. View Post
Falls dein Compiler C++0x unterstützt könntest du Threads so verwenden:
Code:
    
   #include <iostream>
   #include <thread>
   #include <chrono>

    void ThreadFunc() 
    {
        std::this_thread::sleep(std::chrono::seconds(1)); 
    }

    int main() 
    {
        std::thread Thread(ThreadFunc); //Start Thread

        Thread.join(); //Wait untill the thread finishes its work
        return 0;
    }

Ich denke er wird erstweil auch ohne auskommen.


Es scheint als würde der Visual c++ 2010 Compiler kein C++0x
unterstützen da er mir etliche Fehler anzeigt und es sich auch nicht Compilen lässt trd danke für die Antwort.
marykillsjane is offline  
Old 09/29/2012, 20:17   #17
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by marykillsjane View Post
if (!hThread || !dwThreadID)
return 1;
Wofür ist dieser if Befehl?
if hThread nicht und dwThreadID nicht wiederhole
Ich verstehe nicht was diese anweisung bezwecken soll und außerdem wäre es noch nett wenn mir jmd erklären könnte warum hier bei return eine 1 gesetzt wird kenne es bis jetzt nur mit einer 0 ?
Das if macht folgendes:
Code:
if(hThread == 0 || dwThreadID == 0)
Und etwas anderes als 0 gibt man dann zurück, wenn das Programm frühzeitig bzw. unerwartet beendet wird. Also konkret wenn ein Fehler aufgetreten ist. Aber das ist nur wichtig, wenn externe Programme prüfen sollen, ob dein Programm sauber beendet wurde.

Quote:
Originally Posted by marykillsjane View Post
Es scheint als würde der Visual c++ 2010 Compiler kein C++0x
unterstützen da er mir etliche Fehler anzeigt und es sich auch nicht Compilen lässt trd danke für die Antwort.
Warum nutzt du nicht die aktuelle 2012er Version? Da wird das bereits unterstützt.
Nightblizard is offline  
Thanks
1 User
Old 09/30/2012, 00:57   #18


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
2012 hat afaik noch ein paar Bugs. Ist das nicht sogar noch in der Beta?
MrSm!th is offline  
Old 09/30/2012, 02:02   #19
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Ich nutz das seit es noch VS11 Beta hieß und kann mir nicht mehr vorstellen wieder zurück zu müssen. Intellisense ist deutlich zuverlässiger (aber noch immer ziemlich beschissen), vom C++11 Standard ist deutlich mehr implementiert und du hast jede Menge andere neue Spielzeuge bekommen wie z.B. C++ AMP.

Bugs sind mir bisher keine aufgefallen, abgesehen von den üblichen Intellisense Spinnereien.

Das wurde vor ein oder zwei Wochen erst auf den Markt gebracht, also keine Beta, nein.


Ein Updgrade von Visual Studio hat sich imo bisher noch immer gelohnt und das ist dieses mal nicht anders!
Nightblizard is offline  
Old 09/30/2012, 06:33   #20
 
marykillsjane's Avatar
 
elite*gold: 0
Join Date: Sep 2010
Posts: 1,909
Received Thanks: 522
Quote:
Originally Posted by Nightblizard View Post
Das if macht folgendes:
Code:
if(hThread == 0 || dwThreadID == 0)
Und etwas anderes als 0 gibt man dann zurück, wenn das Programm frühzeitig bzw. unerwartet beendet wird. Also konkret wenn ein Fehler aufgetreten ist. Aber das ist nur wichtig, wenn externe Programme prüfen sollen, ob dein Programm sauber beendet wurde.


Warum nutzt du nicht die aktuelle 2012er Version? Da wird das bereits unterstützt.
Danke für die erklärung.
Ich nutze die 2010er version von Visual c++ ,da es bei einem Buch was ich mir mal gekauft habe als Cd dabei war und ich mich wie gesagt bis jetzt eigentlich wenig-garnicht mit meinem Compiler befasst habe da ich ja erstmal die Grundlegenden Dinge lernen wollte.
Wenn ich mir jetzt die 2012 version holen will kostet das bestimmt wd was oder kann man das kostenlos updaten?Weil wenn es Kostenpflichtig ist lohnt sich sowas für mich wenn überhaupt erst in einigen Monaten wenn ich auch was mit den ganzen neuen Dingen anfangen kann ^^.

Die Fragen haben sich nun auch alle geklärt ich habs jetzt auch endlich gebacken bekommen es nicht durch enter ( wegen getchar() ) die Schleife stoppen zu lassen sondern per eingabe vielen Dank an alle ihr habt echt Hammer Beispiele gebracht und das auch noch sehr schnell.
Gute Community hier ^^.
marykillsjane is offline  
Old 10/02/2012, 17:20   #21
 
Preakz's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 84
Received Thanks: 22
Lightbulb

/************************************************** *******************/
/************************************************** *******************/
long WINAPI thread1()
{
while (1)
{

}
return 0;
}
/************************************************** *******************/
/************************************************** *******************/
long WINAPI thread2()
{
while (1)
{

}
return 0;
}
/************************************************** *******************/
/************************************************** *******************/
long WINAPI thread3()
{
while (1)
{

}
return 0;
}
/************************************************** *******************/
/************************************************** *******************/
long WINAPI thread4()
{
while (1)
{

}
return 0;
}
/************************************************** *******************/
/************************************************** *******************/
int main()
{

HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, 0, 0, 0);
HANDLE hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, 0, 0, 0);
HANDLE hThread3 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread3, 0, 0, 0);
HANDLE hThread4 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread4, 0, 0, 0);

WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
WaitForSingleObject(hThread3, INFINITE);
WaitForSingleObject(hThread4, INFINITE);



CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
CloseHandle(hThread4);

return 0;


}
/************************************************** *******************/
/************************************************** *******************/
Preakz is offline  
Thanks
2 Users
Old 10/05/2012, 22:51   #22


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Wenn ich mir jetzt die 2012 version holen will kostet das bestimmt wd was oder kann man das kostenlos updaten?Weil wenn es Kostenpflichtig ist lohnt sich sowas für mich wenn überhaupt erst in einigen Monaten wenn ich auch was mit den ganzen neuen Dingen anfangen kann ^^.
Es gibt immer auch die kostenlose Express Version.
MrSm!th is offline  
Thanks
1 User
Old 10/06/2012, 23:45   #23
 
elite*gold: 0
Join Date: Dec 2011
Posts: 26
Received Thanks: 2
@Preakz

Also ich würde nicht 4 Funktionen erstellen, die genau das Gleiche machen. Damit verfehlst du ja irgendwie den Sinn von Funktionen. Ich bevorzuge da eher so etwas:

Code:
void WINAPI thread_func(LPVOID param)
{
  std::cout << "Hello from Thread "<<(int)param<<endl;
}

int main()
{
  HANDLE hThread1 = CreateThread(NULL, 0,  (LPTHREAD_START_ROUTINE)thread_func, (void *)0, 0, 0);
HANDLE hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, (void *)1, 0, 0);
HANDLE hThread3 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, (void *)2, 0, 0);
HANDLE hThread4 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, (void *)3, 0, 0);

WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
WaitForSingleObject(hThread3, INFINITE);
WaitForSingleObject(hThread4, INFINITE);



CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
CloseHandle(hThread4);

return 0;


}
Ich habe nochmal eine andere Frage, die bei mir aufgetaucht ist. Wie schaut es denn eigentlich bei parallelen Algorithmen mit dem Zugriff auf Speicherplatz aus?
Wenn wir zB einen MergeSort hernehmen: können die 4 Threads gleichzeitig auf verschiedene Stellen eines int-Arrays zugreifen? Die Speicherstellen würden sich ja nie überschneiden. Also müsste das ja (meiner Meinung nach) eigentlich gehen.
Aber wie sähe das jetzt zB bei einem Vector (der hierfür denke ich eh nicht geeignet ist) aus?
daemon7777 is offline  
Old 10/07/2012, 13:36   #24


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Sollte mit beiden eigentlich problemlos gehen
MrSm!th is offline  
Old 10/08/2012, 14:48   #25
 
elite*gold: 0
Join Date: Jun 2012
Posts: 187
Received Thanks: 58
Bei Vectoren ist es nur bedingt möglich - man kann nicht vorhersagen wann und ob bei einer Vectoroperation neuer Speicher angefordert wird und somit der gesamte Vector im Speicher verlagert wird. Bei einer Sortierfunktion kommt es auf den Vector an - bei einem Vector der nur Pointer enthält ist es von den Zugriffen her durchaus möglich, denn ein Pointer ist von atomarer größe, wird also immer im gesamten gelesen und geschrieben, sodass keine kaputten Pointer gelesen werden können da entweder der gesamte Pointer geändert wurde oder noch nichts.

An sich stelle ich es mir jedoch schwierig vor einen generellen Vector mit mehrere Threads zu sortieren, angenommen der vector sieht so aus:

1
3
2
4

und man hat 2 Threads die den Vector sortieren sollen - der erste Thread muss zwangsläufig die "3" in den unteren Speicherbereich schieben, für den aber eigentlich der 2te Thread zuständig ist. Der zweite Thread tauscht die 2 mit der 3 bevor der erste Thread bei der 3 angekommen ist, hat diese aber eventuell bereits in einer Puffervariable - das Resultat von dem Beispielvector sortiert mit der Bubblesort Methode und 2 Threads ergibt nach der Sortierung dadurch wieder den Ausgangsvector. Bei nicht atomaren Werten wie char* ggf. einen Deadlock oder eine AV.
tnd0 is offline  
Old 10/08/2012, 16:07   #26


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Er sagte ja auch nicht Bubblesort, sondern Mergesort: Das ist auf Verfahren ultithreading ausgelegt, hab jetzt aber auch nicht im Kopf, wie es funktioniert.

Quote:
man kann nicht vorhersagen wann und ob bei einer Vectoroperation neuer Speicher angefordert wird
Wieso sollte beim reinen verschieben von bereits vorhandenen und allozierten Elementen neuer Speicher angefordert werden?
Lässt sich da der Standard echt so viel Spielraum? oO
MrSm!th is offline  
Reply


Similar Threads Similar Threads
Vb.Net String für multithreading?
11/24/2011 - General Coding - 13 Replies
Hey, ich habe einen socket server mit multithreading und setze nach Class ein paar sachen wie z.b. Dim paketcommand2 as string = vbnullstring ich greife mit einem multithreading thread darauf zu und dann kommt immer Das ActiveX-Steuerelement 248dd896-bb45-11cf-9abc-0080c7e7b78d kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist. wie kann ich das ändern ohne es in jede Sub reinzuschreiben? da ich dort auch sachen gesetzt habe die von mehreren subs...
[C++] D3D Multithreading
08/24/2011 - C/C++ - 0 Replies
Sry kann closed werde. MfG
Multithreading
03/17/2010 - AutoIt - 16 Replies
$handle = DllCallbackRegister("_Threadstart"," ;int","ptr") $handlr = DllCallbackRegister("_Threadstard"," ;int","ptr") $dll = DllStructCreate("Char;int") DllStructSetData($dll,1,"hi") DllStructSetData($dll,2,1234) $ret = DllCall("kernel32.dll","hwnd", "CreateThread","ptr",0,"d word",0,"long",DllCallbackGetPtr($h andle),"ptr",DllStructGetPtr($dll)," ;long",0,"int*",0)...
C++ Multithreading + Klassen
01/16/2010 - C/C++ - 8 Replies
Mein Problem ist es , dass ich eine Klasse habe (nehmen wir als Beispiel Auto) und eine Funktion (Beispiel : BremswegBerechnen) habe , die aber in einem extra Thread laufen soll . Also so in etwa : . . . int main() { CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)BM W.BremswegBerechnen, 0, 0, 0);



All times are GMT +1. The time now is 01:19.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.