Du bist nicht angemeldet.

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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

01.03.2017, 17:30

[C++] Threads Synchronisieren

Guten Tage Spieleprogrammierer Gemeinde,

ich habe ein Problem damit mehrer Threads zu synchronisieren.

Folgendes Problem:

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
47
48
49
50
51
static std::array<double> data;
static std::array<double> data_copy;

class Task{

 Task() : running(false), t(&Task::run, this) {}

 void start(){runing = true;}
 
 void wait (){
   std::unique_lock<std::mutex>lk(mutex)
   while(!cv.wait_for(lk, std::chrono::milliseconds(1),[this] {return !this->running.load())
     cv.notify_all();
  }

 void _run()
 {
  while (true)
  {
   std::unique_lock<std::mutex>lk(mutex)
   cv.wait(lk, [this] {return this->running.load();
   data_copy[id] = data[id] * id;
   running.store(false);
   cv.notify_all();
  }
 }


 const int id; 
 std::condition_variable cv;
 std::atomic_bool runing;
 std::mutex mutex;
 std::thread t;
};

int main(){

task t1;

for(I=0; I < 500; I++)
{
 t1.start();
 t2.start();

 t1.wait();
 t2.wait();

 data = data_copy;
 //Log data
}
}




Das funktioniert soweit erst einmal. Doch nach einer Zeit fällt die Leistung enorm ein. Ich gehe davon aus das das Timing es nicht mehr tut und die Threads länger aufeinander warten müssen. Wie wird so eine Synchronisation normalerweise gemacht?

Danke schon einmal im Voraus.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Volker_Neff« (02.03.2017, 10:37)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

01.03.2017, 20:16

Ich hab zwar keine Erfahrung mit den C++11 Threads, aber grundsätzlich reicht ein Mutex allein um dafür zu sorgen das immer nur ein Thread auf eine Resource zugreifen kann. Und da hast du z.B. auf http://de.cppreference.com/w/cpp/thread/mutex ein kurzes Beispiel.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

01.03.2017, 21:00

Das ist nicht das Problem. Durch die Struktur ist gesichert das nur ein thread zur Zeit schreiben kann. Was für mich wichtig ist das an einer Zentralen Stelle die daten ins File geschrieben werden und dann alle Threads wieder von vorn anfangen zu rechnen.

4

02.03.2017, 06:10

Dein Beispiel ergibt keinen Sinn, da du überhaupt gar nicht asynchron arbeitest.
Du hast mehrere Tasks, die Dinge in einen zentralen vector schreiben, da musst du natürlich auch einen zentralen Mutex benutzen. Statt wait_for der cv zu nutzen reicht auch einfach wait.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

02.03.2017, 07:44

Das ist nicht das Problem. Durch die Struktur ist gesichert das nur ein thread zur Zeit schreiben kann.

Dufür brauchst halt diese Struktur nicht. Lediglich einen Mutex. Du hattest doch gefragt wie man es normalerweise macht. Normalerweise macht man es nicht komplizierter als es sein muss.

Was für mich wichtig ist das an einer Zentralen Stelle die daten ins File geschrieben werden und dann alle Threads wieder von vorn anfangen zu rechnen.

Das verlinkte Beispiel startet mehrere Threads, wartet darauf das sie abgeschlossen sind, und gibt dann zentral die Ergebnisse aus. Die Ausgabe in eine Datei zu machen und eine Schleife drum zu machen sollte nicht das Problem sein.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

6

02.03.2017, 10:18

Danke schon einmal für eure Antworten. Ich habe das Gefuehl das ich die Verwendung von Mutex noch nicht ganz verstanden habe.

Ein Mutex blockt doch einen Speicherblock dafür das nur ein Thread zur Zeit darauf zugreifen kann.

Mein Ziel der Struktur oben war halt, dass der Thread nicht jedes Mal neu erstellt wird, sondern einfach seinen Loop wieder neu begint wenn die Daten Frisch sind. Wahrscheinlich bin ich damit aber etwas auf dem Holzweg unterwegs.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Volker_Neff« (02.03.2017, 10:39)


Werbeanzeige