Kein Threadlock in xlocale der STL bei BCB2006?



  • Hallo,

    heute hatte ich unerklärliche, sporadische Zugriffverletzungen bezüglich stringstreams im BCB2006. Und zwar traten diese allesamt im Header "xlocale" der STL auf.

    const _Facet& use_facet(const locale& _Loc)
    	{	// get facet reference from locale
    	_Lockit _Lock(_LOCK_LOCALE);	// the thread lock, make get atomic
    	const locale::facet *_Psave =
    		_Facetptr<_Facet>::_Psave;	// static pointer to lazy facet
    
    	size_t _Id = _Facet::id;
    	const locale::facet *_Pf = _Loc._Getfacet(_Id);
    

    In der letzten Zeile tritt die Zugriffsverletzung auf (in "_Getfacet"). Ich verwende mehrere Threads. Dafür scheint ja ein threadlock zu existieren.

    Entsprechende Stelle aus yvals.h

    explicit _Lockit(int _Type)
    		: _Locktype(_Type)
    		{	// set the lock
    		_MAYBE_LOCK
    			_Locksyslock(_Locktype);
    		}
    

    Problem ist nur, dass _MAYBE_LOCK ein Macro ist, welches zu

    #define _MAYBE_LOCK	\
    	if (_Locktype == _LOCK_MALLOC || _Locktype == _LOCK_DEBUG)
    

    wird.

    _Locktype ist aber "_LOCK_LOCALE". Ein Lock wird also für Locales nicht erstellt. Warum nicht? Ist hier wieder Erwarten kein Lock nötig? Wenn nein, wo könnte sonst der Fehler liegen? Leider konnte ich keinen Source zur Funktion "_Getfacet" auffinden.

    Googeln ergab bisher, dass andere Leute ähnliche Probleme mit Streams hatten. Nur leider ohne vielversprechende Lösung.

    In der aktuellen STL von VS 2010 wird übrigens alles gelockt (die Implementierungen unterscheiden sich aber natürlich).


Anmelden zum Antworten