F
@DocShoe sagte in static und thread_local:
Meine Frage bezieht sich auf die initial_pary und initial_sbox. Im verlinkten C++ Code sind die static const und werden kopiert, in meiner C Implementation waren sie non-static global und wurden vor der Ver- und Entschlüsselung initialisiert und währenddessen verändert.
Wurden die Tabellen nur einmalig initialisiert oder vor jedem Ver-/Entschlüsselungs-Run? Weisst du, wozu die erwähnten Veränderungen gut sind? Werden die Tabellen vielleicht einfach nur als "Abreitsbereich" für einen Durchlauf den Algorithmus benötigt und vorher immer in einen wohldefinierten Anfangszustand gebracht, so wie sie da hartcodiert in dem von dir verlinketen Code stehen?
Wenn letzteres der Fall ist, würde ich aus dem Bauch heraus auch dazu tendieren, dass thread_local wohl ausreicht. Festlegen will ich mich da aber lieber nicht, da ich mir die Mühe sparen will, das Ding vollständig zu verstehen
Wenn dieser "Arbeitsbereich" aber ohnehin jedes mal neu initialisiert werden muss, dann halte ich das memcpy in eine lokale Tabelle allerdings für eine gar nicht mal so schlechte Lösung, die möglicherweise sogar noch flotter ist als das, was da vorher gemacht wurde (Tabelle "berechnet"?)
Ich denke dir ist auch bewusst, dass bezüglich Thread-Safety für die von dir verlinkte Klasse jeder Thread seine eigene Blowfish-Instanz haben sollte oder aber alle Member-Funktionen-Aufrufe, die irgendwie mit pary_ oder sbox_ herumhantieren z.B. mit einem Mutex synchronisiert werden müssen - genau wie die std::vector<char>& für Klartext, Chiffre und Key (?).
Und auch wenn das nicht dein Code ist, möchte ich noch erwähnen, dass so eine Initialisierung lokaler statischer Variablen wie in Zeilen 257 und 258 vom Compiler garantiert threadsicher vonstatten geht. Das ist zwar eigentlich zu begrüssen, aber bedeutet auch, dass einem der Compiler da im ungünstigsten Fall einen Mutex dazwischenschiebt, der bei jedem Aufruf der Funktion gelockt werden muss, auch wenn die Variable nur ein einziges mal beim ersten Funktionsaufruf geschrieben wird. Da es sich mit dem sizeof um compile-time-konstante Werte handelt, wäre ein Mutex hier wirklich unnötiger Overhead. static constexpr oder auch ein static const Member würden das vermeiden.