boost::shared_ptr threadsave
-
Ich verstehs gerade einfach nicht. Folgendes problem.
Ich lade scripte aus einer db in eine tabelle. Geht problemlos.
Dabei ist halt eine spalte ein shared ptr auf das eigentliche script.Wenn ich nun einen eintrag aus der tabelle suche übergebe ich der eigentlichen funktion ein dummy objekt per reference und wenn ein objekt gefunden wurde wird dies in das dummy objekt geschrieben, hier mal beispielcode
bool CCommonObjectTable::find( TYPE_OF_ITEM_ID Id, CommonStruct &ret ) { TABLE::iterator iterator; iterator = m_table.find( Id ); if ( iterator == m_table.end() ) { return false; } else { ret = ( *iterator ).second; return true; } }bisher lief damit auch alles wirklich wunderbar.
Nur seitdem ich da ein paar dinge gethreaded mache segfaultet ab und an das programm.Dabei ist mir aufgefallen das aus irgend einen grund der shared ptr nicht mehr so wirklich gültig ist, er zeigt zwar noch irgendwo hin ist aber nicht mehr das war er zu sein scheint, denn er hat keine der members mehr die er haben sollte.
Obwohl das ggf auch daher kommen kann das gerade er gerade im destructor für dieses objekt steckt wenn er crasht. Aber genau dann sollte ja das script noch immer als ptr existieren. Weil er ja über das common struct eine kopie vom script bekommt.
Zur info, der aufbau eines CommonStruct
struct CommonStruct { TYPE_OF_ITEM_ID id; TYPE_OF_WEIGHT Weight; TYPE_OF_VOLUME Volume; TYPE_OF_AGEINGSPEED AgeingSpeed; TYPE_OF_OBJECTAFTERROT ObjectAfterRot; bool rotsInInventory; bool isStackable; boost::shared_ptr<CLuaItemScript> script; CommonStruct( const CommonStruct& source) { id = source.id; Weight = source.Weight; Volume = source.Volume; AgeingSpeed = source.AgeingSpeed; ObjectAfterRot = source.ObjectAfterRot; rotsInInventory = source.rotsInInventory; isStackable = source.isStackable; script = source.script; } CommonStruct& operator=(const CommonStruct&source) { id = source.id; Weight = source.Weight; Volume = source.Volume; AgeingSpeed = source.AgeingSpeed; ObjectAfterRot = source.ObjectAfterRot; rotsInInventory = source.rotsInInventory; isStackable = source.isStackable; script = source.script; return *this; } CommonStruct() { id = 0; Weight = 0; Volume = 0; AgeingSpeed = 0; ObjectAfterRot = 0; rotsInInventory = false; isStackable = false; script = boost::shared_ptr<CLuaItemScript>(); } } ;vielleicht fällt hier jemanden was dazu ein. solange es nicht im thread läuft gehts aber sobald es gethreaded ist segfaultet das proggie ab und an
-
boost::shared_ptr ist nicht thread-safe.
-
ok hab das auch gerade mit bekommen und ich suche seit 3 tagen nach dem problem, hatte auch mal im web geschaut und glaube irgendwo gelesen zu haben das sie threadsave sind. trotzdem danke.
-
A) boost::shared_ptr IST thread safe in dem Sinn dass man verschiedene shared_ptr Instanzen auf das selbe Objekt in verschiedenen Threads ohne Synchronisierung verwenden kann. Voraussetzung dafür ist dass boost mit Threads support verwendet wird, also z.B. darf das macro BOOST_DISABLE_THREADS nicht definiert sein. Überprüfen kann man das einfach mit einem #ifdef BOOST_HAS_THREADS.
boost::shared_ptr IST NICHT thread safe in dem Sinn dass man nicht ein und die selbe shared_ptr Instanz in mehreren threads ohne Synchronisierung verwenden kann. (nur lesen aus mehreren threads ist aber OK.)boost::shared_ptr ist damit genauso sehr oder wenig thread safe wie ein normaler Zeiger ("raw pointer").
und glaube irgendwo gelesen zu haben das sie threadsave sind.
Damit ist (A) gemeint. Bei einer straight forward Implementierung die nicht auf Threads achtet wäre nämlich nichteinmal das gegeben. Mach aber erstmal folgendes in dein Programm rein, vielleicht verwendest du die boost ja ohne Thread Support:
#ifndef BOOST_HAS_THREADS #error Brauche boost mit thread support! #endifSollte das das Problem sein musst du einfach nur deine boost so konfigurieren dass sie weiss welche Threading Lib sie verwenden soll.