Synchronisation von Threads will nicht klappen
-
Man könnte auch mit Events arbeiten.
CreateEvent(), SetEvent(), WaitForSingleObject() etc...
-
Mann muss nicht nur für Schreibzugriffe sperren, sondern auch für Lesezugriffe.
Ok das mit den Critical Section probiere ich mal dass die global sind.
Wäre nett wenn einer aber die geanue Ursache weißt.PS: Es kommt jedes mal ein anderer Output, und ab und zu stürzt das Prgramm halt ab
PPS: Kann mir einer ein gutes Tutorial geben über die Sychronisierung von Threads mit der WinApi (nicht MFC)
-
Wo muss denn jetzt genau eine Critical Section initialisiert werden? In irgendeinem Thread muss es ja passieren?
-
Jetzt auch noch das Problem wenn ich eine Critical Section global mache:
Main.obj : error LNK2005: "struct _RTL_CRITICAL_SECTION g_cs" (?g_cs@@3U_RTL_CRITICAL_SECTION@@A) already defined in CAudio.obj
Main.obj : error LNK2005: "struct _RTL_CRITICAL_SECTION g_cs" (?g_cs@@3U_RTL_CRITICAL_SECTION@@A) already defined in CAudio.obj
Main.obj : warning LNK4006: "struct _RTL_CRITICAL_SECTION g_cs" (?g_cs@@3U_RTL_CRITICAL_SECTION@@A) already defined in CAudio.obj; second definition ignoredwas heißt denn jetzt das wieder.
-
Hast du in deinen Headern Include Guards benutzt? Irgendwas wird halt doppelt definiert
-
Oh ich habs ausversehen über den IncludeGuard geschrieben, jetzt hab ich es drunter, aber jetzt kommt noch:
Main.obj : error LNK2005: "struct _RTL_CRITICAL_SECTION g_cs" (?g_cs@@3U_RTL_CRITICAL_SECTION@@A) already defined in CAudio.obj
Main.obj : warning LNK4006: "struct _RTL_CRITICAL_SECTION g_cs" (?g_cs@@3U_RTL_CRITICAL_SECTION@@A) already defined in CAudio.obj; second definition ignored
Creating library Debug/CAudio.lib and object Debug/CAudio.exp
-
lad mal den quelltext mit projektdateien hoch und wir finden den fehler in ein paar sekunden
-
ne ne das geht nicht, das ist ein größeres projekt
Aber was ist denn das beste. CriticalSections Events, Mutexe, Semaphoren
-
jaja, immer diese anti-open-source-programmierer
beste für deine Situtation natürlich Critical Sections!
-
ne ich find meinen code nur so peinlich
-
trau dich...keiner wird lachen und keiner wird dir irgendeine idee klauen. wir wollen dir nur helfen die beiden fehler zu berichtigen!
-
So, das mit den mehrfach definierten symbolen hab ich gelöst, ein kleiner leichtsinnsfehler.
Könnte mir bitte einer ein kleines beispiel schreiben. Wäre super
-
Mann muss nicht nur für Schreibzugriffe sperren, sondern auch für Lesezugriffe.
Warum?
Wenn 8 Threads von einer Variable lesen, dann bekommen doch alle das gleiche, also warum sperren?
Sperren muss man, sobald ein Thread Schreibzugriff hat!
-
Komisch, beim Lesen einer Variable, die auf einen gültigen Zeiger zeigt kommt nur Schmarrn raus. Wenn ich aber die Variable im Hauptthread auslese kommt das richtige raus. kann das noch einen anderen grund haben.
Und noch was. Ist es richtig so zu synchronisieren.
CRITICAL_SECTION sc
InitalializeCriticalSection(&cs);
Im neuen Thread:
EnterCriticalSection(&cs);
//Variablenzugriff
LeaveCriticalSection(&cs);am ende des programms:
DeleteCriticalSection(&cs);Is das so richtig
-
Sagt mir nur ob das richtig ist, dann hör ich auf zu nerven
-
...bitte...
-
ja, richtig
P.S. Beispiel, wenn man mal 10 Sekunden in die MSDN schauen würde:
// Global variable CRITICAL_SECTION CriticalSection; void main() { ... // Initialize the critical section one time only. InitializeCriticalSection(&CriticalSection); ... // Release resources used by the critical section object. DeleteCriticalSection(&CriticalSection) } DWORD WINAPI ThreadProc( LPVOID lpParameter ) { ... // Request ownership of the critical section. __try { EnterCriticalSection(&CriticalSection); // Access the shared resource. } __finally { // Release ownership of the critical section. LeaveCriticalSection(&CriticalSection); } ... }
[ Dieser Beitrag wurde am 29.10.2002 um 08:57 Uhr von RenéG editiert. ]
-
Danke, ich habe es ja eigentlich so gemahct.