Frage zu Multithreading
-
Hallo,
ich weiß, dass Threads zum Teil ihre eigenen Sichtbarkeitsbereiche haben, da sie eigenes Caches haben.
Ich frage mich aber, wie weit das geht.
Wenn ich bspw. einen Thread-Pool (selbst implementiert) mit einem einzigen Thread habe und diesem eine Task übergebe, wo über eine Referenz auf ein std::vector zugegriffen und etwas hinzugefügt wird, sollte das theoretisch thread-safe sein, da innerhalb dieses Threads die Tasks nacheinander abgearbeitet werden.
Wie sieht das aber mit Caching aus? Wird immer der aktuellste Zustand gesehen?std::vector<foo> foos; thread_pool thread_pool(1); thread_pool.enqueue([&] { // Do something foos.emplace_back(foo(...)); });
Danke im Voraus und viele Grüße
-
-
@manni66 Ich weiß, dass zumindest bei Java das volatile Keyword existiert, damit Threads bspw. keine alten int-Werte sehen und sich den Wert stattdessen vom langsamen RAM holen anstatt vom CPU-Cache.
Gibt es solche Phänomene in C++ nicht?
-
Wieso soll das theoretisch thread-safe sein? Entweder es greift nur ein Thread auf den Vektor zu, dann ist das alles von vornherein unproblematisch. Oder es greift noch ein anderer Thread (zB der Hauptthread) darauf zu, dann ist es offensichtlich nicht mehr theoretisch thread-safe.
-
@Steffo sagte in Frage zu Multithreading:
Gibt es solche Phänomene in C++ nicht?
Doch. Das hat aber weder in Java noch in C++ etwas damit zu tun, dass ein Thread einen eigenen Cache hätte.
-
@Bashar sagte in Frage zu Multithreading:
Wieso soll das theoretisch thread-safe sein? Entweder es greift nur ein Thread auf den Vektor zu, dann ist das alles von vornherein unproblematisch. Oder es greift noch ein anderer Thread (zB der Hauptthread) darauf zu, dann ist es offensichtlich nicht mehr theoretisch thread-safe.
Der Hauptthread greift erst dann darauf zu, wenn der Thread-Pool abgearbeitet ist.
-
@Steffo sagte in Frage zu Multithreading:
Gibt es solche Phänomene in C++ nicht?
Nimm lieber Rust
scnr
-
Abgearbeitet heißt? Ich nehme an, da das ein Threadpool ist, ist der Thread nicht gejoint.
Ich tippe darauf, dass es dann nicht synchronisiert wird, aber ich werde versuchen es herauszufinden.
@Belli sagte in Frage zu Multithreading:
Nimm lieber Rust (scnr)
In (safe) Rust gibt es solche Phänomene tatsächlich nicht.
-
@Bashar sagte in Frage zu Multithreading:
Abgearbeitet heißt? Ich nehme an, da das ein Threadpool ist, ist der Thread nicht gejoint.
Im Destruktor des Threadpools werden alle Threads gejoint. Wenn ich also den Scope des Threadpools-Objekt entsprechend eingrenze, dürfte das kein Problem sein, oder?
-
@Belli sagte in Frage zu Multithreading:
@Steffo sagte in Frage zu Multithreading:
Gibt es solche Phänomene in C++ nicht?
Nimm lieber Rust
scnr
Das wollte ich schreiben!
-
Ich habe mich nun dazu entschieden die Ergebnisse in einem future zu sammeln (der Threadpool kann auch futures zurückgeben), diese in einem Vektor zu stecken und anschließend über die futures zu iterieren. Dadurch kann ich auch lock-free mehr Threads verwenden.