Ich habe eine einfache Multithread-Anwendung. Alle Threads werden nur Operationen in derselben Datenbank ausführen. Aber bevor ein Thread eine Put-Operation ausführt, wird er zuerst eine Mutex-Sperre erwerben, um die Schlüsselnummer zu erhöhen und dann die Sperre aufzuheben und dann die Put-Operation durchzuführen, dh die Threads werden Elemente mit unterschiedlicher Schlüsselnummer möglicherweise gleichzeitig einfügen Zeit. Das habe ich in meiner Bewerbung gemacht.Multithread-Anwendungen in Berkeley DB
Worüber ich immer noch verwirrt bin ist, ob diese einfache App DB_INIT_LOCK-Flag oder DB_INIT_CDB-Flag angeben muss? Ich habe das Dokument über diese Flaggen gelesen. DB_INIT_CDB bedeutet mehrere Lesevorgänge/einzelner Schreiber, aber in meiner einfachen App können die Threads gleichzeitig arbeiten, nicht einzelne Schreiber, also brauche ich sie nicht. Für DB_INIT_LOCK, da die Threads nie das Element mit dem gleichen Schlüssel einfügen, brauche ich es nicht, habe ich Recht?
Bitte korrigieren Sie mich, wenn ich falsch liege. Danke vielmals.
Vielen Dank für Ihre Antwort. Es ist sehr wahrscheinlich, dass die ersten beiden Datensätze auf der gleichen Seite in db sind. Ich habe jedoch gelesen, dass "die Zugriffsmethoden außer der Warteschlange Sperren auf Seitenebene sind". Hier ist der [link] (http://www.mtholeyoke.edu/~mcrowley/perl-tmp/docs.db277/ref/am/pagesize.html). Wenn ich also die Zugriffsmethode auf Btree eingestellt habe, hilft mir BDB beim automatischen Sperren auf Seitenebene. Ich muss DB_INIT_LOCK in diesem Szenario nicht angeben. – HuangJie
Die Berkeley DB-Dokumentation kann sicher verwirrend sein. Dieser Link ist technisch korrekt - er funktioniert auf Seitenebene. Aber ich kann Ihnen aus Erfahrung sagen, dass es das sicherlich nicht automatisch macht. Sie benötigen DB_INIT_LOCK, um es zu aktivieren. Aber Sie werden es ziemlich schnell herausfinden, wenn Sie die Datenbank mit mehreren Threads ausprobiert haben! :) –