Hallo,
ich möchte nur eine bestimmte Anzahl an Threads zulassen an einer Stelle weiterzumachen, sodass die anderen solange warten sollen.
Habe das mit atomics und sleep umgesetzt, überlege aber ob das so ok ist. Ich vermute die erste Variante ist nicht ganz ok so, in der zweiten sollte es sicherer sein per lock_guard.
Variante 1: vermutlich nicht gut denn es könnte vielleicht zwischen der if-Abfrage und dem hochzählen der atomic ein anderer Thread in der Zeit durchrutschen...?
Variante 2: sicherer per lock_guard
Ist Variante 2 ok so mit lock_guard um die Dinge oder ist das zu trashig? Verbesserungsvorschläge immer gerne
Gruß
ich möchte nur eine bestimmte Anzahl an Threads zulassen an einer Stelle weiterzumachen, sodass die anderen solange warten sollen.
Habe das mit atomics und sleep umgesetzt, überlege aber ob das so ok ist. Ich vermute die erste Variante ist nicht ganz ok so, in der zweiten sollte es sicherer sein per lock_guard.
Variante 1: vermutlich nicht gut denn es könnte vielleicht zwischen der if-Abfrage und dem hochzählen der atomic ein anderer Thread in der Zeit durchrutschen...?
C++:
// global:
std::atomic<int> AktuelleAnzahlAktiverThreads = {0};
std::atomic<int> MaximaleAnzahlAktiverThreads = {1};
C++:
// in Thread:
while(1)
{
if(AktuelleAnzahlAktiverThreads < MaximaleAnzahlAktiverThreads)
{
AktuelleAnzahlAktiverThreads++;
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // CPU lover
}
// thread tut etwas...
// wenn fertig:
AktuelleAnzahlAktiverThreads--;
Variante 2: sicherer per lock_guard
C++:
// global:
std::atomic<int> AktuelleAnzahlAktiverThreads = {0};
std::atomic<int> MaximaleAnzahlAktiverThreads = {1};
std::mutex mtx;
C++:
// in Thread:
while(1)
{
{ // lock-scope
std::lock_guard<std::mutex> lock(mtx);
if(AktuelleAnzahlAktiverThreads < MaximaleAnzahlAktiverThreads)
{
AktuelleAnzahlAktiverThreads++;
break;
}
} // unlock
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // CPU lover
}
// thread tut etwas...
// wenn fertig:
{ // lock-scope
std::lock_guard<std::mutex> lock(mtx);
AktuelleAnzahlAktiverThreads--;
} // unlock
Ist Variante 2 ok so mit lock_guard um die Dinge oder ist das zu trashig? Verbesserungsvorschläge immer gerne
Gruß