Parameters: scrutinise behaviour under load
- Fix several subtle (and not so subtle) bugs. - Verify correct behaviour under concurrent pressure - leaving out the Mutex-lock leads to corrupted internal state - effect of the Atomics can not be demonstrated Note: occasional failures because the threads sleep to allow the other threads to complete their work. If a thread wakes up too early, it might see stale state and access index-slots that are not yet published. This confirms: you **must not** access registration IDs unless you got them from somewhere, which ensures they were registered and the change is visible.
This commit is contained in:
parent
f79c2e15e9
commit
8b3e05e99b
3 changed files with 357 additions and 117 deletions
|
|
@ -24,9 +24,9 @@
|
|||
** - the storage is organised by a fixed-sized index table and heap allocated storage extents.
|
||||
** - entries are never discarded, and thus an atomic lock suffices _for read access_
|
||||
** @remark while this scheme is defined in a generic way, it aims at one specific
|
||||
** usage pattern and should not be stretched beyond that.
|
||||
**
|
||||
** @todo WIP-WIP-WIP can be considered an initial draft and placeholder, as of 2026
|
||||
** usage pattern and should not be stretched beyond that: it is *essential* that
|
||||
** only IDs are accessed that where retrieved from somewhere beforehand.
|
||||
** @see TypeRegistry_test
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -39,11 +39,8 @@
|
|||
#include "lib/nocopy.hpp"
|
||||
#include "lib/format-string.hpp"
|
||||
#include "lib/uninitialised-storage.hpp"
|
||||
//#include "lib/meta/trait.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
//#include <concepts>
|
||||
//#include <limits>
|
||||
#include <atomic>
|
||||
#include <array>
|
||||
|
||||
|
|
@ -53,7 +50,7 @@ namespace par {
|
|||
namespace err = lumiera::error;
|
||||
|
||||
using util::_Fmt;
|
||||
// using util::unConst;
|
||||
|
||||
|
||||
/**
|
||||
* Management of descriptor entries keyed by numeric ID.
|
||||
|
|
@ -87,13 +84,19 @@ namespace par {
|
|||
uint size() const { return size_; }
|
||||
uint numExtents() const { return size_? 1 + (size_-1) / EXTENT_SIZ : 0; }
|
||||
|
||||
static constexpr uint MAX_ELEMS = EXTENT_SIZ*INDEX_SIZ;
|
||||
|
||||
~TypeRegistry();
|
||||
private:
|
||||
Extent* accessExtent (ID) const;
|
||||
};
|
||||
|
||||
|
||||
/** type tagged numeric registry entry ID */
|
||||
|
||||
|
||||
/**
|
||||
* type-tagged numeric registry entry ID
|
||||
*/
|
||||
template<class ELM>
|
||||
class TypeRegistry<ELM>::ID
|
||||
{
|
||||
|
|
@ -112,6 +115,7 @@ namespace par {
|
|||
* @remark the *write path* is mutex-protected.
|
||||
* It is used for new registrations, which typically
|
||||
* is not required from a hot path.
|
||||
* @throws err::State when capacity is exhausted
|
||||
* @note EX_STRONG
|
||||
*/
|
||||
template<class ELM>
|
||||
|
|
@ -119,11 +123,11 @@ namespace par {
|
|||
inline TypeRegistry<ELM>::ID
|
||||
TypeRegistry<ELM>::makeSlot (INIT&&... initArg)
|
||||
{
|
||||
if (size_ >= INDEX_SIZ*EXTENT_SIZ)
|
||||
Lock sync{this};
|
||||
if (size_ >= MAX_ELEMS)
|
||||
throw err::State{_Fmt{"TypeRegistry space exhausted for type %s"} % meta::typeStr<ELM>()
|
||||
, LERR_(CAPACITY)};
|
||||
|
||||
Lock sync{this};
|
||||
ID entryID{size_};
|
||||
auto& indexSlot = index_[entryID / EXTENT_SIZ];
|
||||
Extent* extent = indexSlot.load (std::memory_order_acquire);
|
||||
|
|
@ -166,6 +170,7 @@ namespace par {
|
|||
|
||||
|
||||
|
||||
/** @internal */
|
||||
template<class ELM>
|
||||
inline TypeRegistry<ELM>::Extent*
|
||||
TypeRegistry<ELM>::accessExtent (ID entryID) const
|
||||
|
|
@ -175,16 +180,22 @@ namespace par {
|
|||
}
|
||||
|
||||
/**
|
||||
* access slot by ID, protected by atomic-acquire
|
||||
* Access slot by ID, protected by atomic-acquire
|
||||
* @throws err::Logic when accessing a free slot
|
||||
* @throws err::Invalid on index beyond storage capacity
|
||||
* @note EX_STRONG
|
||||
*/
|
||||
template<class ELM>
|
||||
inline ELM&
|
||||
TypeRegistry<ELM>::operator[] (ID entryID) const
|
||||
{
|
||||
if (entryID >= MAX_ELEMS)
|
||||
throw err::Invalid{_Fmt{"TypeRegistry(%s): index %d out of bounds"} % meta::typeStr<ELM>() % uint(entryID)
|
||||
, LERR_(INDEX_BOUNDS)};
|
||||
|
||||
Extent* extent = accessExtent (entryID);
|
||||
if (not extent)
|
||||
throw err::Logic{_Fmt{"TypeRegistry: entryID = %d not yet allocated"} % entryID
|
||||
throw err::Logic{_Fmt{"TypeRegistry(%s): entryID = %d not yet allocated"} % meta::typeStr<ELM>() % uint(entryID)
|
||||
, LERR_(INDEX_BOUNDS)};
|
||||
|
||||
return (*extent)[entryID % EXTENT_SIZ];
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
|
||||
#include "test/run.hpp"
|
||||
//#include "test/test-helper.hpp"
|
||||
#include "test/test-helper.hpp"
|
||||
#include "lib/par/type-registry.hpp"
|
||||
#include "lib/scoped-collection.hpp"
|
||||
#include "test/tracking-dummy.hpp"
|
||||
|
|
@ -26,16 +26,9 @@
|
|||
#include "lib/thread.hpp"
|
||||
#include "lib/random.hpp"
|
||||
#include "lib/util.hpp"
|
||||
#include "test/diagnostic-output.hpp"/////////////TODO
|
||||
|
||||
//#include <utility>
|
||||
//#include <string>
|
||||
//#include <vector>
|
||||
#include <chrono>
|
||||
|
||||
//using std::string;
|
||||
//using std::vector;
|
||||
//using std::swap;
|
||||
using lib::explore;
|
||||
using util::isSameObject;
|
||||
using std::this_thread::yield;
|
||||
|
|
@ -47,29 +40,27 @@ namespace lib {
|
|||
namespace par {
|
||||
namespace test{
|
||||
|
||||
// using lumiera::error::LUMIERA_ERROR_LOGIC;
|
||||
|
||||
namespace {//Test fixture....
|
||||
|
||||
const uint NUM_THREADS = util::max (2u, std::thread::hardware_concurrency());
|
||||
const uint NUM_ENTRIES = 100'000;
|
||||
|
||||
}//(End)Test fixture
|
||||
|
||||
using ::test::Dummy;
|
||||
using Registry = TypeRegistry<Dummy>;
|
||||
using RegID = Registry::ID;
|
||||
|
||||
namespace {//Test configuration....
|
||||
|
||||
const uint NUM_THREADS = util::max (2u, std::thread::hardware_concurrency());
|
||||
const uint NUM_ENTRIES = Registry::MAX_ELEMS / NUM_THREADS;
|
||||
|
||||
}//(End)Test setup
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**************************************************************************//**
|
||||
* @test verify a index/extent based registration table for type descriptors
|
||||
* @test verify an index/extent based registration table for type descriptors
|
||||
* - new slots can be claimed and then re-accessed by ID
|
||||
* - storage is stable even while new extents are added, and not leaked
|
||||
* - read access can happen concurrently with allocating new slots.
|
||||
* - read access can happen concurrently while allocating new slots.
|
||||
*/
|
||||
class TypeRegistry_test : public Test
|
||||
{
|
||||
|
|
@ -112,7 +103,6 @@ namespace test{
|
|||
* - when the registry is full, further allocations are blocked
|
||||
* - but even a then the registry remains in sane state
|
||||
* - all destructors of all slots are invoked
|
||||
* @todo WIP 10/26 ✔ define ⟶ ✔ implement
|
||||
*/
|
||||
void
|
||||
verify_storageSanity()
|
||||
|
|
@ -209,7 +199,6 @@ namespace test{
|
|||
* - after adding the next number, read recent new entries and sum up
|
||||
* - at the end, each thread must have seen all entries, and all the
|
||||
* summed-up numbers must be consistent.
|
||||
* @todo WIP 10/26 🔁 define ⟶ ✔ implement
|
||||
*/
|
||||
void
|
||||
verify_concurrentAccess()
|
||||
|
|
@ -221,10 +210,10 @@ namespace test{
|
|||
auto genLoad = [&]{ return [&testRegistry
|
||||
,&startTrigger
|
||||
,expectedSum
|
||||
,random = 2 + rani(4)
|
||||
,random = 2 + rani(4) // evaluated for each thread anew, and in the main thread
|
||||
]{
|
||||
size_t mySum{0};
|
||||
uint lastSeen{0};
|
||||
int lastSeen{-1};
|
||||
volatile size_t blackHole{0};
|
||||
auto randomDelay = [&]{ if (0 == lastSeen % random) blackHole += lastSeen; };
|
||||
|
||||
|
|
@ -241,19 +230,19 @@ namespace test{
|
|||
randomDelay();
|
||||
|
||||
//--------------------------------------- read other entries
|
||||
for (uint e=entryID; e >= lastSeen; --e)
|
||||
for (int e=entryID; e > lastSeen; --e)
|
||||
mySum += testRegistry[e];
|
||||
|
||||
lastSeen = entryID;
|
||||
lastSeen = int(entryID);
|
||||
}
|
||||
// to sleep for an eternity
|
||||
sleep_for (10ms);
|
||||
sleep_for (50ms);
|
||||
|
||||
// complete to read all other entries
|
||||
for (uint e=lastSeen+1; e < NUM_THREADS*NUM_ENTRIES; ++e)
|
||||
mySum += testRegistry[e];
|
||||
|
||||
CHECK (mySum = NUM_THREADS * expectedSum (NUM_ENTRIES));
|
||||
CHECK (mySum == NUM_THREADS * expectedSum (NUM_ENTRIES));
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -263,12 +252,12 @@ namespace test{
|
|||
// unleash
|
||||
startTrigger.sync();
|
||||
|
||||
sleep_for(12ms);
|
||||
sleep_for(60ms);
|
||||
|
||||
while (explore(threads).has_any())
|
||||
yield();
|
||||
|
||||
CHECK (testRegistry.size() == NUM_THREADS * expectedSum (NUM_ENTRIES));
|
||||
CHECK (testRegistry.size() == NUM_THREADS * NUM_ENTRIES);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -86124,9 +86124,9 @@
|
|||
<node CREATED="1790469747133" ID="ID_107922186" MODIFIED="1790469747133" TEXT="mit Wert-Ermittlungs-Funktionen (pure)"/>
|
||||
<node CREATED="1789079698677" ID="ID_1651075832" MODIFIED="1790469774810" TEXT="jedoch ohne operationallisierte Logik"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1789082704022" ID="ID_1925473607" MODIFIED="1789082723794" TEXT="muß eine Registry bereits jetzt bauen">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1789082704022" ID="ID_1925473607" MODIFIED="1792277287662" TEXT="muß eine Registry bereits jetzt bauen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789082726792" ID="ID_383248634" MODIFIED="1789082726792" TEXT="Frage im bestehenden Chat nochmal nach — mit konkretem Implementierungs-Szenario">
|
||||
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789082726792" FOLDED="true" ID="ID_383248634" MODIFIED="1792277296425" TEXT="Frage im bestehenden Chat nochmal nach — mit konkretem Implementierungs-Szenario">
|
||||
<arrowlink COLOR="#51bbdf" DESTINATION="ID_1161327543" ENDARROW="Default" ENDINCLINATION="231;13;" ID="Arrow_ID_994670578" STARTARROW="None" STARTINCLINATION="-183;-140;"/>
|
||||
<icon BUILTIN="wizard"/>
|
||||
<node CREATED="1789082815287" ID="ID_104427970" MODIFIED="1789082927619" TEXT="beschreibe Registrierung des Scale-Desriptors">
|
||||
|
|
@ -86287,9 +86287,9 @@ class ScaleRegistry
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1789159365103" ID="ID_435108847" MODIFIED="1790094564624" TEXT="sollte dann wohl gleich eine generische Registry sein...">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1789159365103" ID="ID_435108847" MODIFIED="1792277314150" TEXT="sollte dann wohl gleich eine generische Registry sein...">
|
||||
<linktarget COLOR="#426aa5" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="28;-70;" ID="Arrow_ID_1818399541" SOURCE="ID_735608493" STARTARROW="None" STARTINCLINATION="-393;12;"/>
|
||||
<linktarget COLOR="#365ac0" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="-11;82;" ID="Arrow_ID_246372510" SOURCE="ID_438812693" STARTARROW="None" STARTINCLINATION="14;-8;"/>
|
||||
<linktarget COLOR="#365ac0" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="-27;101;" ID="Arrow_ID_246372510" SOURCE="ID_438812693" STARTARROW="None" STARTINCLINATION="14;-8;"/>
|
||||
<node CREATED="1789159448086" ID="ID_1755995276" MODIFIED="1789159547368" TEXT="Feste Index-Tabelle + heap-allozierte Extents"/>
|
||||
<node COLOR="#338800" CREATED="1790478166301" ID="ID_1258631659" MODIFIED="1792201647439" TEXT="Implementierung nach Standard-Schema (wie von Claude vorgeschlagen)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -86311,6 +86311,10 @@ class ScaleRegistry
|
|||
</node>
|
||||
<node CREATED="1792195292550" ID="ID_1991831189" MODIFIED="1792195314280" TEXT="die Slot-Auswahl erfolgt per Modulus">
|
||||
<icon BUILTIN="info"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792257772332" ID="ID_550004421" MODIFIED="1792257805244" TEXT="und dabei auch out-of-bounds prüfen">
|
||||
<linktarget COLOR="#e0021f" DESTINATION="ID_550004421" ENDARROW="Default" ENDINCLINATION="1236;0;" ID="Arrow_ID_1455631653" SOURCE="ID_977075189" STARTARROW="None" STARTINCLINATION="610;-27;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1792195325746" ID="ID_1685989678" MODIFIED="1792200835146" TEXT="Belegung wird (implizit) durch ein size-Feld definiert">
|
||||
<icon BUILTIN="forward"/>
|
||||
|
|
@ -86356,12 +86360,12 @@ class ScaleRegistry
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1790478209106" ID="ID_1599776496" MODIFIED="1790478269240" TEXT="Testabdeckung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1790478209106" ID="ID_1599776496" MODIFIED="1792277224879" TEXT="Testabdeckung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1790478219335" ID="ID_265184931" MODIFIED="1792201649437" TEXT="Standard-Nutzen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1790478228069" ID="ID_194433887" MODIFIED="1792207934918" TEXT="Memory-Konsistenz">
|
||||
<node COLOR="#338800" CREATED="1790478228069" FOLDED="true" ID="ID_194433887" MODIFIED="1792277246502" TEXT="Memory-Konsistenz">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#df0277" CREATED="1792204102943" ID="ID_1794382952" MODIFIED="1792207761829" TEXT="erst mal denke ich: Kindergarten.....">
|
||||
<font NAME="SansSerif" SIZE="11"/>
|
||||
|
|
@ -86406,15 +86410,15 @@ class ScaleRegistry
|
|||
<node CREATED="1792207903239" ID="ID_140698597" MODIFIED="1792207930110" TEXT="alle Destruktoren aufgerufen"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1790478238100" ID="ID_1243204093" MODIFIED="1790478263177" TEXT="Concurrency safe">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1792243503003" ID="ID_118835140" MODIFIED="1792243516591" TEXT="Ziel: concurrent Pressure">
|
||||
<node COLOR="#338800" CREATED="1790478238100" FOLDED="true" ID="ID_1243204093" MODIFIED="1792277333650" TEXT="Concurrency safe">
|
||||
<linktarget COLOR="#e9fdca" DESTINATION="ID_1243204093" ENDARROW="Default" ENDINCLINATION="46;151;" ID="Arrow_ID_470786963" SOURCE="ID_297548263" STARTARROW="None" STARTINCLINATION="76;11;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1792243503003" ID="ID_118835140" MODIFIED="1792277229161" TEXT="Ziel: concurrent Pressure">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1792243524508" ID="ID_1160740004" MODIFIED="1792243541074" TEXT="bedeutet: Wahrscheinlichkeit für Kollisionen erhöhen"/>
|
||||
<node CREATED="1792243563343" ID="ID_1528908673" MODIFIED="1792243660072" TEXT="Problem hier: die Operationen sind für sich genommen schnell">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
eine Heap-Allokation kostet <i>amortisiert</i> nur 40ns, und der Rest ist <i>fast nix</i>.
|
||||
|
|
@ -86424,9 +86428,7 @@ class ScaleRegistry
|
|||
</node>
|
||||
<node CREATED="1792243672752" ID="ID_85638427" MODIFIED="1792243990414" TEXT="es besteht die Gefahr daß Threads nicht kollidieren weil sie warten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Das Mutex-Lock-induzierte Weit, sowie die Scheduler-Aktivität sind um den Faktor 1000 langsamer als die eigentliche Nutzarbeit; möglicherweise warten fast alle Threads die meiste Zeit — wodurch die Wahrscheinlichkeit für Kollisionen gegen Null geht.
|
||||
|
|
@ -86439,9 +86441,7 @@ class ScaleRegistry
|
|||
<node CREATED="1792244036770" ID="ID_1866810841" MODIFIED="1792244069698" TEXT="Verhältnis Lesen zu Registrieren ≡ 10 : 1"/>
|
||||
<node CREATED="1792244161658" ID="ID_1060660077" MODIFIED="1792244279235" TEXT="nur wenig und kurze Randomisierung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Kein Zugriff auf den Zufallszahlengenerator während der aktiven Phase, und nur kurze Randomisierungs-Schleifen.
|
||||
|
|
@ -86451,28 +86451,24 @@ class ScaleRegistry
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792244285441" ID="ID_1100815459" MODIFIED="1792244288521" TEXT="Testaufbau">
|
||||
<node COLOR="#338800" CREATED="1792244285441" ID="ID_1100815459" MODIFIED="1792277235067" TEXT="Testaufbau">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1792244289873" ID="ID_1530115505" MODIFIED="1792244301259" TEXT="Load-Thrad definieren">
|
||||
<node CREATED="1792244569484" ID="ID_53941596" MODIFIED="1792244585294" TEXT="Lesen konzentriert sich um die Füll-Front">
|
||||
<node CREATED="1792244686306" ID="ID_1166915882" MODIFIED="1792252324751" TEXT="über die eigene letzte ID hinaus lesen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
damit man möglichst Einträge erfaßt, die ein anderer Thread grade gemacht hat
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1792244586773" ID="ID_802085787" MODIFIED="1792256760255" TEXT="bräuchte dazu eine contains()-Funktion">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
eine solche Funktion ist aber nicht gut...
|
||||
|
|
@ -86489,36 +86485,29 @@ class ScaleRegistry
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="closed"/>
|
||||
</node>
|
||||
<node CREATED="1792252624719" ID="ID_1048890891" MODIFIED="1792252729856" TEXT="damit kann ich die Struktur nicht aggressiv unter Druck setzen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Weil durch einem Schreibvorgang eine acquire-Barriere erzwungen ist, und jeder Thread damit trivialerweise die vorhergehenden Einträge im Cache hat (es sei denn, sie liegen in einem anderen Extent)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1792252731864" ID="ID_1325538886" MODIFIED="1792252995344" TEXT="allerdings: mehr Druck gibt es in der Praxis auch nicht">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
auch im realen Einsatz liest schlimmstenfalls ein anderer Thread mit einer gewissen Verzögerung, und garantiert hinter einer schreib+lese-Barrier (weil er sonst die ID gar nicht kennen könnte)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#605e7c" DESTINATION="ID_1325538886" ENDARROW="Default" ENDINCLINATION="347;18;" ID="Arrow_ID_1434324540" SOURCE="ID_793070482" STARTARROW="Default" STARTINCLINATION="434;0;"/>
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
|
|
@ -86527,9 +86516,7 @@ class ScaleRegistry
|
|||
<node CREATED="1792244788143" ID="ID_1720732613" MODIFIED="1792244815063" TEXT="Randomisierung nur zwischen den Blocks"/>
|
||||
<node CREATED="1792244825410" ID="ID_381939462" MODIFIED="1792244896220" TEXT="Randomisierung nur per Modulus-Check">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
ist mein eigener aktueller Zähler durch meine feste Zufallszahl teilbar?
|
||||
|
|
@ -86546,9 +86533,7 @@ class ScaleRegistry
|
|||
<node CREATED="1792246293354" ID="ID_1313021588" MODIFIED="1792246304300" TEXT="muß eine Zufallszahl in jeden Thread bekommen">
|
||||
<node CREATED="1792246339080" ID="ID_1594128477" MODIFIED="1792251554934" TEXT="λ-Thread scheidet damit aus">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das Thema hatte ich schon x-mal, zuletzt beim BufferProviderLoad_test (dafür habe ich dann sogar ScopedCollection <i>aufgebohrt</i> und λ-Initialisierung eingebaut)
|
||||
|
|
@ -86580,34 +86565,27 @@ class ScaleRegistry
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1792251557240" ID="ID_1731075562" MODIFIED="1792251684525" TEXT="ein dedizierter LoadThread führt zu einer komplexen Code-Struktur">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
der müßte dann nämlich als Member der Testklasse definiert sein, damit der die gemeinsame SyncBarrier sieht. Das wiederum erfordert dann, daß die zu testende Registry irgendwie als Parameter durchgefädelt werden muß. Die Struktur knallen wir dann dem Leser vor den Latz....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1792251686884" ID="ID_1108149420" MODIFIED="1792251781746" TEXT="dann doch lieber noch ein doppelt verschachteltes λ">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das kann ich wenigstens als Variable definieren, und die innere Capture explizit ausformulieren
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792247295125" ID="ID_403445735" MODIFIED="1792247319218" TEXT="dann kann man auch alle Threads mit einer N+1-Barriere starten"/>
|
||||
|
|
@ -86615,49 +86593,305 @@ class ScaleRegistry
|
|||
<node CREATED="1792244377340" ID="ID_265966366" MODIFIED="1792244387626" TEXT="Ergebnis prüfen">
|
||||
<node CREATED="1792252818802" ID="ID_268890956" MODIFIED="1792252847071" TEXT="ich muß vor allem auf Data-Corruption prüfen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
denn eine entgleiste Datenstruktur würde sich nur so zeigen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1792252852039" ID="ID_1022907040" MODIFIED="1792252867471" TEXT="also muß jeder geschriebene / gelesene Wert verifizierbar sein"/>
|
||||
<node CREATED="1792252869846" ID="ID_1697985306" MODIFIED="1792252953009" TEXT="Verwende die übliche Formel für arithmetische Reihen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
1...N ≡ N/2 · (N+1)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1792252900815" ID="ID_793070482" MODIFIED="1792253003046" TEXT="allerdings hier N mal, und in unregelmäßiger Reihenfolge">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Jeder Thread registriert Zahlen 1...N, und die Reihenfolge ist randomisiert
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#605e7c" DESTINATION="ID_1325538886" ENDARROW="Default" ENDINCLINATION="347;18;" ID="Arrow_ID_1434324540" STARTARROW="Default" STARTINCLINATION="434;0;"/>
|
||||
</node>
|
||||
<node CREATED="1792254526676" ID="ID_758874087" MODIFIED="1792254547549" TEXT="am Ende noch die restlichen Einträge der anderen Threads aufsammeln"/>
|
||||
<node CREATED="1792254548569" ID="ID_975718912" MODIFIED="1792254562075" TEXT="dann muß jeder Thread die volle (vorhersehbare) Summe haben"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1792257550197" ID="ID_93395088" MODIFIED="1792277175635" TEXT="Verhalten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a20d73" CREATED="1792257558199" ID="ID_1924509365" MODIFIED="1792268758433" TEXT="mit 10'000 Einträgen pro Test : keine Reaktion??"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792257571633" ID="ID_886717663" MODIFIED="1792268925541" TEXT="100'000 Einträge ⟹ Segfault">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792257600842" ID="ID_1214717319" MODIFIED="1792257687008" TEXT="zunächst einmal klar : das sind weit mehr als 16bit">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#b10041" CREATED="1792257693102" ID="ID_977075189" MODIFIED="1792257805244">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
oha ... da haben wir <b><font color="#ee0130">glorreich</font></b> über das Index-Array hinausgeschrieben
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#e0021f" DESTINATION="ID_550004421" ENDARROW="Default" ENDINCLINATION="1236;0;" ID="Arrow_ID_1455631653" STARTARROW="None" STARTINCLINATION="610;-27;"/>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792258033468" ID="ID_1324798713" MODIFIED="1792268728295" TEXT="also ⟹ NUM_ENTRIES dynamisch setzen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<div style="background-color: #eee0b5; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 2px">
|
||||
<div style="color: #202020; background-color: #eee0b5; font-family: DejaVu Sans Mono; font-size: 9pt; white-space: pre">
|
||||
<p style="margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0">
|
||||
<font color="#4a1a65"><b>const</b></font><font color="#3a1f18"> </font><font color="#8c505c"><b>uint</b></font><font color="#3a1f18"> </font><font color="#dd1616"><i>NUM_THREADS</i></font><font color="#3a1f18">  </font><font color="#65533c">=</font><font color="#3a1f18"> </font><font color="#535773">util</font><font color="#65533c">::</font><font color="#000000">max</font><font color="#3a1f18"> </font><font color="#11123a">(</font><font color="#29466b">2</font><font color="#3a1f18">u</font><font color="#65533c">,</font><font color="#3a1f18">  </font><font color="#535773">std</font><font color="#65533c">::</font><font color="#635e96"><b>thread</b></font><font color="#65533c">::</font><font color="#642880"><b>hardware_concurrency</b></font><font color="#11123a">())</font><font color="#65533c">;</font>
|
||||
</p>
|
||||
<p style="margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0">
|
||||
<font color="#4a1a65"><b>const</b></font><font color="#3a1f18"> </font><font color="#8c505c"><b>uint</b></font><font color="#3a1f18"> </font><font color="#dd1616"><i>NUM_ENTRIES</i></font><font color="#3a1f18">  </font><font color="#65533c">=</font><font color="#3a1f18"> </font><font color="#8c505c"><b>Registry</b></font><font color="#65533c">::</font><font color="#0000c0"><i>MAX_ELEMS</i></font><font color="#3a1f18"> </font><font color="#65533c">/</font><font color="#3a1f18">  </font><font color="#dd1616"><i>NUM_THREADS</i></font><font color="#65533c">;</font>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1792268787558" ID="ID_1423742164" MODIFIED="1792269702694" TEXT="Limit-Check in TypeRegistry<ELM>::makeSlot() nicht threadsafe">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i><font color="#670155">was hab ich mir da gestern wohl gedacht??</font></i> 
|
||||
</p>
|
||||
<p>
|
||||
<font size="2">(ich weiß es sogar noch: oh wie clever, das teure Lock spare ich mir wenn der Parameter eh zu groß ist)</font>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1792268934387" ID="ID_181443857" MODIFIED="1792269697534" TEXT="Summe geht nicht auf wie erwartet">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1792269611584" ID="ID_1996352005" MODIFIED="1792269646229">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
habe jedes <font face="Monospaced" color="#572525">lastSeen</font> beim nächsten Mal nochmal mitgenommen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1792269611584" ID="ID_897686184" MODIFIED="1792269692002">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
sollte <font color="#572525" face="Monospaced">lastSeen</font> auf Integer umstellen und bei -1 starten
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#174956" COLOR="#8dfd49" CREATED="1792277201911" HGAP="33" ID="ID_305179383" MODIFIED="1792277217874" STYLE="bubble" TEXT="Testfall läuft nun" VSHIFT="8">
|
||||
<edge COLOR="#61fe5b" STYLE="bezier" WIDTH="thin"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1792270291467" ID="ID_841893257" MODIFIED="1792277171141" TEXT="Gegencheck">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1792270298500" ID="ID_1739539647" MODIFIED="1792270327981" TEXT="Lock und Atomic entfernen">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792270443969" ID="ID_1815214875" MODIFIED="1792270450609" TEXT="entryID = 40448 not yet allocated">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1792270489656" ID="ID_1089380302" MODIFIED="1792270499670" TEXT="gleichzeitig 8 mal und alle Threads sterben"/>
|
||||
<node CREATED="1792270455641" ID="ID_1477501436" MODIFIED="1792272762968" TEXT="beachte 40448 < 65535"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1792270523151" ID="ID_523440074" MODIFIED="1792270534398" TEXT="Deutung: size_ korrumpiert">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792271157818" ID="ID_1467307248" MODIFIED="1792271163037" TEXT="Lock aber kein Atomic">
|
||||
<node CREATED="1792271165049" ID="ID_841265790" MODIFIED="1792271178332" TEXT="läuft mehr als 100 mal ohne Fehler"/>
|
||||
<node CREATED="1792271179205" ID="ID_1864273081" MODIFIED="1792271189242" TEXT="aber sporadische Entgleisungen">
|
||||
<node CREATED="1792271191564" ID="ID_95641853" MODIFIED="1792271191564" TEXT="entryID = 59648 not yet allocated"/>
|
||||
<node CREATED="1792271194282" ID="ID_1765071748" MODIFIED="1792271200856" TEXT="jeweils variierende ID"/>
|
||||
<node CREATED="1792271202948" ID="ID_399190509" MODIFIED="1792271212711" TEXT="am wahrscheinlichsten direkt nach einem Build"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#dfb094" COLOR="#990033" CREATED="1792271215083" ID="ID_1845816444" MODIFIED="1792276977130" TEXT="den Mechanismus verstehe ich nicht">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1792271292600" ID="ID_838056614" MODIFIED="1792271312258" TEXT="die viel zu große entryID muß ja aus makeSlot() kommen"/>
|
||||
<node CREATED="1792271460418" ID="ID_1289029456" MODIFIED="1792271481451" TEXT="und außerdem, wie käme der Zugriff dann am ersten Check vorbei"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792276905309" ID="ID_470059765" MODIFIED="1792277102001" TEXT="GANZ ANDERS: der Zugreifer sieht eine veraltete Index-Tabelle">
|
||||
<arrowlink COLOR="#ff0011" DESTINATION="ID_218264644" ENDARROW="Default" ENDINCLINATION="-470;38;" ID="Arrow_ID_1636781122" STARTARROW="None" STARTINCLINATION="-515;0;"/>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792277120433" ID="ID_40460263" MODIFIED="1792277161612" TEXT="dieser Fall belegt: Atomics haben auf x86_64 oft keine große Wirkung">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1792272292139" ID="ID_966858973" MODIFIED="1792276989939" TEXT="auch mit Lock und Atomic reproduzierbar">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1792272472699" ID="ID_1222559139" MODIFIED="1792272476255" TEXT=""TypeRegistry(uint): entryID = 56832 not yet allocated""/>
|
||||
<node CREATED="1792272584023" ID="ID_217165939" MODIFIED="1792272585920" TEXT="TypeRegistry(uint): entryID = 43520 not yet allocated"/>
|
||||
<node CREATED="1792272746791" ID="ID_952333301" MODIFIED="1792272788277" TEXT="TypeRegistry(uint): entryID = 63232 not yet allocated"/>
|
||||
<node BACKGROUND_COLOR="#fde4cf" COLOR="#bd004b" CREATED="1792273012091" FOLDED="true" ID="ID_218264644" MODIFIED="1792277102001" TEXT="ein Fall mit dem Debugger gefangen">
|
||||
<linktarget COLOR="#ff0011" DESTINATION="ID_218264644" ENDARROW="Default" ENDINCLINATION="-470;38;" ID="Arrow_ID_1636781122" SOURCE="ID_470059765" STARTARROW="None" STARTINCLINATION="-515;0;"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1792273042730" ID="ID_510718019" MODIFIED="1792273049746" TEXT="aus der abschließende Lese-Schleife">
|
||||
<node CREATED="1792273050982" ID="ID_438849667" MODIFIED="1792273072846" TEXT="lastSeen ≡ 30298"/>
|
||||
<node CREATED="1792273104951" ID="ID_916826246" MODIFIED="1792273115246" TEXT="e ≡ 50688"/>
|
||||
<node CREATED="1792273124480" ID="ID_1220972122" MODIFIED="1792275313440" TEXT="aber size_ ≡ 53763">
|
||||
<linktarget COLOR="#bf81a3" DESTINATION="ID_1220972122" ENDARROW="Default" ENDINCLINATION="735;0;" ID="Arrow_ID_830799763" SOURCE="ID_295974397" STARTARROW="Default" STARTINCLINATION="208;13;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792273194019" ID="ID_1566753034" MODIFIED="1792273196447" TEXT="Registry">
|
||||
<node CREATED="1792273124480" ID="ID_948370618" MODIFIED="1792274855552" TEXT="size_ ≡ 53763"/>
|
||||
<node CREATED="1792273199690" ID="ID_1935288287" MODIFIED="1792273206589" TEXT="index">
|
||||
<node CREATED="1792273207690" ID="ID_1430663220" MODIFIED="1792273228222" TEXT="slots 0...210 gefüllt"/>
|
||||
<node CREATED="1792273228999" ID="ID_356183924" MODIFIED="1792273233794" TEXT="ab 211 leer"/>
|
||||
<node CREATED="1792273266746" ID="ID_1880666518" MODIFIED="1792273283843" TEXT="210*256 ≡ 53760"/>
|
||||
</node>
|
||||
<node CREATED="1792273750258" ID="ID_357426575" MODIFIED="1792273800860" TEXT="Zugriffspfad: 50688 / 256 ≡ 198">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
<node CREATED="1792273809333" ID="ID_1420646062" MODIFIED="1792274424107" TEXT="Extent* ≡ NULL"/>
|
||||
<node CREATED="1792273815765" ID="ID_1734998941" MODIFIED="1792274852794" TEXT="aber index_[198] ist alloziert">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
198 std::atomic<lib::UninitialisedStorage<unsigned int, 256>*> std::atomic<lib::UninitialisedStorage<unsigned int, 256> *> = { 0x7fffcc005340 }
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792273935530" ID="ID_1281393535" MODIFIED="1792273938763" TEXT="andere Threads">
|
||||
<node CREATED="1792273939872" ID="ID_1510819169" MODIFIED="1792273957553" TEXT="Thread-1 : yield (≙ Master-Thread)"/>
|
||||
<node CREATED="1792273958350" ID="ID_1935229667" MODIFIED="1792273965433" TEXT="Thread-2 : schläft"/>
|
||||
<node CREATED="1792274032748" ID="ID_1540494337" MODIFIED="1792274043791" TEXT="Thread-3 : liest">
|
||||
<node CREATED="1792274044739" ID="ID_362694525" MODIFIED="1792274057673" TEXT="greift zu auf e = 53632"/>
|
||||
<node CREATED="1792274122800" ID="ID_652913716" MODIFIED="1792274126604" TEXT="slot 209">
|
||||
<node CREATED="1792274179273" ID="ID_1466245923" MODIFIED="1792274186351" TEXT="sieht man auch in atomic::load"/>
|
||||
</node>
|
||||
<node CREATED="1792274058589" ID="ID_1605079301" MODIFIED="1792274063160" TEXT="ist grade im atomic_load"/>
|
||||
</node>
|
||||
<node CREATED="1792274227622" ID="ID_1330889300" MODIFIED="1792274234959" TEXT="Thread-4 : hat belegt">
|
||||
<node CREATED="1792274326005" ID="ID_1061604010" MODIFIED="1792274339118" TEXT="neue entryID ≡ 53710"/>
|
||||
<node CREATED="1792274237721" ID="ID_475583328" MODIFIED="1792274244531" TEXT="ist grade im ~Lock()"/>
|
||||
<node CREATED="1792274274192" ID="ID_577092471" MODIFIED="1792274280095" TEXT="std::mutex::unlock()"/>
|
||||
<node CREATED="1792274283019" ID="ID_623392438" MODIFIED="1792274291061" TEXT="ist grade eben beim Aufwecken anderer Threads"/>
|
||||
</node>
|
||||
<node CREATED="1792274403801" ID="ID_983201517" MODIFIED="1792274514344" TEXT="Thread-5 : löst den Fehler aus">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1792275063786" ID="ID_1789747481" MODIFIED="1792275082573" TEXT="TypeRegistry<ELM>::operator[50688]"/>
|
||||
<node CREATED="1792275108087" ID="ID_1829403001" MODIFIED="1792275127058" TEXT="hat einen Extent* ≡ NULL bekommen"/>
|
||||
</node>
|
||||
<node CREATED="1792274515155" ID="ID_1851308568" MODIFIED="1792274523659" TEXT="Thread-6 : will grade belegen">
|
||||
<node CREATED="1792274525439" ID="ID_1868340507" MODIFIED="1792274531965" TEXT="Schleife">
|
||||
<node CREATED="1792274532809" ID="ID_1828090361" MODIFIED="1792274541611" TEXT="i=8117"/>
|
||||
<node CREATED="1792274542832" ID="ID_1007624398" MODIFIED="1792274565057" TEXT="lastSeen ≡ 53746"/>
|
||||
</node>
|
||||
<node CREATED="1792274566860" ID="ID_1178816857" MODIFIED="1792274585960" TEXT="geht grade in den Lock-ctor"/>
|
||||
<node CREATED="1792274594985" ID="ID_1411588216" MODIFIED="1792274608323" TEXT="std::mutex::lock()"/>
|
||||
<node CREATED="1792274618622" ID="ID_439126687" MODIFIED="1792274623801" TEXT="pthread-mutex-lock"/>
|
||||
<node CREATED="1792274624573" ID="ID_1114698355" MODIFIED="1792274640903" TEXT="III_muteck_optimized"/>
|
||||
</node>
|
||||
<node CREATED="1792274678509" ID="ID_709049273" MODIFIED="1792274687705" TEXT="Thread-7 : will grade belegen">
|
||||
<node CREATED="1792274688869" ID="ID_364484977" MODIFIED="1792274691816" TEXT="Schleife ">
|
||||
<node CREATED="1792274532809" ID="ID_780156178" MODIFIED="1792274708773" TEXT="i=5327"/>
|
||||
<node CREATED="1792274542832" ID="ID_240253925" MODIFIED="1792274720285" TEXT="lastSeen ≡ 53728"/>
|
||||
</node>
|
||||
<node CREATED="1792274722453" ID="ID_741829235" MODIFIED="1792274732402" TEXT="geht grade in den Lock-ctor"/>
|
||||
<node CREATED="1792274618622" ID="ID_1442624390" MODIFIED="1792274623801" TEXT="pthread-mutex-lock"/>
|
||||
<node CREATED="1792274624573" ID="ID_855080498" MODIFIED="1792274640903" TEXT="III_muteck_optimized"/>
|
||||
<node CREATED="1792274750292" ID="ID_1656834224" MODIFIED="1792274756148" TEXT="futex_wait()">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792274780273" ID="ID_1197169929" MODIFIED="1792274787994" TEXT="Thread-8 : will grade belegen">
|
||||
<node CREATED="1792274688869" ID="ID_1631818091" MODIFIED="1792274691816" TEXT="Schleife ">
|
||||
<node CREATED="1792274532809" ID="ID_1723881655" MODIFIED="1792274808504" TEXT="i=6613"/>
|
||||
<node CREATED="1792274542832" ID="ID_1322756465" MODIFIED="1792274819879" TEXT="lastSeen ≡ 53762">
|
||||
<node CREATED="1792275279439" ID="ID_295974397" MODIFIED="1792275319864" TEXT="beachte: der hat zuletzt size_ inkrementiert">
|
||||
<arrowlink COLOR="#bf81a3" DESTINATION="ID_1220972122" ENDARROW="Default" ENDINCLINATION="735;0;" ID="Arrow_ID_830799763" STARTARROW="Default" STARTINCLINATION="208;13;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792274722453" ID="ID_418462693" MODIFIED="1792274732402" TEXT="geht grade in den Lock-ctor"/>
|
||||
<node CREATED="1792274618622" ID="ID_193144577" MODIFIED="1792274623801" TEXT="pthread-mutex-lock"/>
|
||||
<node CREATED="1792274624573" ID="ID_1719656745" MODIFIED="1792274640903" TEXT="III_muteck_optimized"/>
|
||||
<node CREATED="1792274750292" ID="ID_1418043567" MODIFIED="1792274756148" TEXT="futex_wait()">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792274922790" ID="ID_918287342" MODIFIED="1792274929903" TEXT="Thread-9 : will grade belegen">
|
||||
<node CREATED="1792274688869" ID="ID_1684863391" MODIFIED="1792274691816" TEXT="Schleife ">
|
||||
<node CREATED="1792274532809" ID="ID_233385159" MODIFIED="1792274978836" TEXT="i=4696"/>
|
||||
<node CREATED="1792274542832" ID="ID_913884863" MODIFIED="1792274988953" TEXT="lastSeen ≡ 53706"/>
|
||||
</node>
|
||||
<node CREATED="1792274722453" ID="ID_1256160753" MODIFIED="1792274732402" TEXT="geht grade in den Lock-ctor"/>
|
||||
<node CREATED="1792274618622" ID="ID_1626360583" MODIFIED="1792274623801" TEXT="pthread-mutex-lock"/>
|
||||
<node CREATED="1792274624573" ID="ID_282459059" MODIFIED="1792274640903" TEXT="III_muteck_optimized"/>
|
||||
<node CREATED="1792274750292" ID="ID_248017892" MODIFIED="1792274756148" TEXT="futex_wait()">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1792275454495" ID="ID_1475466424" MODIFIED="1792275467202" TEXT="Situation verstanden">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1792275469085" ID="ID_1754662833" MODIFIED="1792275475608" TEXT="ein Thread war wesentlich schneller"/>
|
||||
<node CREATED="1792275476611" ID="ID_513321624" MODIFIED="1792275528616" TEXT="sein letzter Slot war 30298/256 ≡ 118"/>
|
||||
<node CREATED="1792275537300" ID="ID_1728954149" MODIFIED="1792275557221" TEXT="er macht einen atomic_acquire auf Slot 198"/>
|
||||
<node CREATED="1792275558153" ID="ID_796911354" MODIFIED="1792275869157" TEXT="bekommt hier aber einen veralteten Stand aus seinem Cache">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1792276013293" ID="ID_1384106578" MODIFIED="1792276036823" TEXT="das wäre eine Wissensfrage">
|
||||
<icon BUILTIN="bell"/>
|
||||
<node CREATED="1792276063646" ID="ID_1500693691" MODIFIED="1792276072025" TEXT="kann dieser Stand noch geladen werden"/>
|
||||
<node CREATED="1792276072853" ID="ID_387512555" MODIFIED="1792276087238" TEXT="...während im Hauptspeicher schon neuere Inhalte stehen?"/>
|
||||
<node CREATED="1792276088412" ID="ID_1561727907" MODIFIED="1792276111139" TEXT="oder muß der Stand im Thread selber (durch Verzögerung) verschleppt sein?"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1792275602771" ID="ID_147433345" MODIFIED="1792275631427" TEXT="während 5 weitere Threads um das Schreiben konkurrieren"/>
|
||||
<node CREATED="1792275651133" ID="ID_1297884064" MODIFIED="1792275667345" TEXT="diese orientieren sich ander size_variablen"/>
|
||||
<node CREATED="1792275804104" ID="ID_1595878577" MODIFIED="1792275817185" TEXT="und erzeugen wohl einen konsistenten Zustand im Hauptspeicher"/>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1792275894468" ID="ID_1023015420" MODIFIED="1792275918137" TEXT="das Problem ist: er greift »blind« auf einen Slot zu ohne diesen vorher gesehen zu haben">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1792275979145" ID="ID_1936849161" MODIFIED="1792275990744" TEXT="im realen Einsatz kann das niemals auftreten"/>
|
||||
<node CREATED="1792275991441" ID="ID_823317849" MODIFIED="1792276008168">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
weil der Zugriff immer auf eine <b>publizierte ID</b> aufbaut
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1792275920872" ID="ID_878841350" MODIFIED="1792277029883" TEXT="und das eigentliche Problem: der sleep war viel zu kurz">
|
||||
<linktarget COLOR="#322190" DESTINATION="ID_878841350" ENDARROW="Default" ENDINCLINATION="-302;15;" ID="Arrow_ID_824852602" SOURCE="ID_1545189256" STARTARROW="None" STARTINCLINATION="184;14;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1792275943910" ID="ID_415339023" MODIFIED="1792275960388" TEXT="weshalb dieser Fall vor allem kurz nach dem Build auftritt"/>
|
||||
<node CREATED="1792275960833" ID="ID_712434268" MODIFIED="1792275974497" TEXT="und schwer reproduzierbar ist"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1792276993680" ID="ID_1545189256" MODIFIED="1792277038258" TEXT="Fazit: eine Schwäche des Testaufbaus">
|
||||
<arrowlink COLOR="#322190" DESTINATION="ID_878841350" ENDARROW="Default" ENDINCLINATION="-302;15;" ID="Arrow_ID_824852602" STARTARROW="None" STARTINCLINATION="184;14;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -87774,8 +88008,8 @@ Prop.1: dist%3 1 2 0 1 2 0
|
|||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1790094459596" ID="ID_184861465" MODIFIED="1790094482634" TEXT="brauche dazu eine Registrierung und Scale-IDs">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1790094501963" ID="ID_438812693" MODIFIED="1790094572153" TEXT="und diese Registry sollte generisch angelegt sein">
|
||||
<arrowlink COLOR="#365ac0" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="-11;82;" ID="Arrow_ID_246372510" STARTARROW="None" STARTINCLINATION="14;-8;"/>
|
||||
<node CREATED="1790094501963" ID="ID_438812693" MODIFIED="1792277260764" TEXT="und diese Registry sollte generisch angelegt sein">
|
||||
<arrowlink COLOR="#365ac0" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="-27;101;" ID="Arrow_ID_246372510" STARTARROW="None" STARTINCLINATION="14;-8;"/>
|
||||
<node CREATED="1790469975638" ID="ID_1306037041" MODIFIED="1790469981295" TEXT="inwiefern?"/>
|
||||
<node CREATED="1790469982412" ID="ID_1297951248" MODIFIED="1790470003336" TEXT="hier ist mehr zu »registrieren« als nur die Scale-Deskriptoren"/>
|
||||
<node CREATED="1790470019568" ID="ID_5893879" MODIFIED="1790470044739" TEXT="also gemeinsames Baumuster — aber nicht universelle Generizität"/>
|
||||
|
|
@ -87790,10 +88024,16 @@ Prop.1: dist%3 1 2 0 1 2 0
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1790474121848" ID="ID_1163539569" MODIFIED="1790474164518" TEXT="Zugriff per Typ(compiletime)+ID(runtime)"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1790474208388" ID="ID_1335701954" MODIFIED="1790478289060" TEXT="Concurrency">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1790474208388" ID="ID_1335701954" MODIFIED="1792277395056" TEXT="Concurrency">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1790474214328" ID="ID_1925127627" MODIFIED="1790474250457" TEXT="Neuerstellen unter globalem Lock (pro Typ ⟶ Registry)"/>
|
||||
<node CREATED="1790474251717" ID="ID_1300983163" MODIFIED="1790474272111" TEXT="Zugriff per atomic-acquire"/>
|
||||
<node COLOR="#013e77" CREATED="1792277318379" ID="ID_297548263" MODIFIED="1792277422007" STYLE="fork" TEXT="(im Test bestätigt)">
|
||||
<arrowlink COLOR="#e9fdca" DESTINATION="ID_1243204093" ENDARROW="Default" ENDINCLINATION="46;151;" ID="Arrow_ID_470786963" STARTARROW="None" STARTINCLINATION="76;11;"/>
|
||||
<node BACKGROUND_COLOR="#f6d3b5" COLOR="#990033" CREATED="1792277350202" HGAP="49" ID="ID_1845441384" MODIFIED="1792277410428" TEXT="wichtige Randbedingung : nur auf bekannte IDs zugreifen" VSHIFT="15">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue