Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
CRITICAL_SECTION cs; std::list<int> my_list; //... InitializeCriticalSection(&cs); // ... void thread1() { while (true) { EnterCriticalSection(&cs); my_list.push_back(23); LeaveCriticalSection(&cs); } } void thread2() { while(true) { EnterCriticalSection(&cs); my_list.push_back(42); LeaveCriticalSection(&cs); } } |
Sorry wenn ich so viele Fragen stelle nur ich fange jetzt erst mit mehreren Threads an
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (10.09.2010, 15:33)
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
class CriticalSection; class CriticalSectionPolicy; typedef CriticalSection* LPCriticalSection; class CriticalSection { friend class CriticalSectionPolicy; private: CRITICAL_SECTION m_Section; public: CriticalSection() { InitializeCriticalSection(&m_Section); } ~CriticalSection() { DeleteCriticalSection(&m_Section); } }; class CriticalSectionPolicy : public Scope::Unique { private: LPCriticalSection m_Critical; bool locked; public: explicit CriticalSectionPolicy(LPCriticalSection section, bool lock = true) { this->m_Critical = section;if(lock)this->lock(); } public: ~CriticalSectionPolicy() { if(this->locked)this->unlock(); } public: void lock() { EnterCriticalSection(&(this->m_Critical->m_Section)); this->locked = true; } public: void unlock() { LeaveCriticalSection(&(this->m_Critical->m_Section)); this->locked = false; } public: bool TryLock() { return TryEnterCriticalSection(&(this->m_Critical->m_Section)); } }; |
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Zeus« (10.09.2010, 22:34)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (10.09.2010, 23:00)
Nunja, die lock und unlock habe ich, da ich mir gedacht habe wenn ich ein rießigen Quellcode habe und den CS nicht weiter blockieren will gebe ich ihn schnell per hand frei ... So können andere Threads weiter arbeiten und müssen nicht warten bis das CS sich von aleine auflöst. Oder ich brauche in einer Funktion ein CS mehrfach. So kann ich ihn zwischenrein immer wieder freigeben und andere Threads können in der Zeit an ihre Daten.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void blub() { // ... { scoped_lock<CriticalSection> lock(cs); // ... } // ... { scoped_lock<CriticalSection> lock(cs); // ... } // ... } |
Das mit dem dem CS alles zusammen habe ich probiert. Also im Constructor dann das Initialisiren von der CS und im Destruktor löschen. Dabei habe ich aber das Problem gehabt das gelegentlich das die CS doppelt Initialisirt oder gelöscht wurde (also von zwei Threads) das hat wieder zum gleichen Fehler geführt wie wenn ich es gleich weg lasse.
Ja stimmt ansich. Wäre besser. Ich arbeite (warum auch immer) gerne mit Pointern. Deshalb hat sich das eingeschlichen das ich nur selten Referenzen nutze.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (11.09.2010, 10:30)
Pointer sind kein Ersatz für Referenzen und umgekehrt.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (11.09.2010, 20:10)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (11.09.2010, 22:33)
Das mit dem dem CS alles zusammen habe ich probiert. Also im Constructor dann das Initialisiren von der CS und im Destruktor löschen. Dabei habe ich aber das Problem gehabt das gelegentlich das die CS doppelt Initialisirt oder gelöscht wurde (also von zwei Threads) das hat wieder zum gleichen Fehler geführt wie wenn ich es gleich weg lasse.
Wie kann das passieren. Das kann doch nur passieren wenn du zwei CS Objekte machst und nicht nur eines für beide Threads!?
Nunja, die lock und unlock habe ich, da ich mir gedacht habe wenn ich ein rießigen Quellcode habe und den CS nicht weiter blockieren will gebe ich ihn schnell per hand frei ... So können andere Threads weiter arbeiten und müssen nicht warten bis das CS sich von aleine auflöst. Oder ich brauche in einer Funktion ein CS mehrfach. So kann ich ihn zwischenrein immer wieder freigeben und andere Threads können in der Zeit an ihre Daten.
"Per Hand freigeben" unterminiert aber den ganzen Sinn der Sache. Außerdem musst du das nicht:
Werbeanzeige