Mutex notwendig?



  • Hallo!

    kann mir jemand helfen und sagen, ob hier ein Mutex erforderlich ist für eine multithreaded Anwendung?
    Verschiedene Threads rufen diese Funktion auf.

    Ist es möglich, daß ich das mutex-ende hinunterziehen muß? Ist in der Kopierroutine irgendetwas nicht thread-sicheres?

    Vielen Dank!

    extern "C" void getStr(const char *ch_request_type, const char *ch_permissions, const char *ch_request,unsigned long request_len, char **ch_result, unsigned long *result_len, const char *user_name)
    {
    	std::string str_result;
    	long result_length=0;
    
    // mutex beginn
    ...
    // mutex ende
    
    	*result_len = str_result.length();
    	(*ch_result) =new char[*result_len+1];
    	memcpy ((*ch_result) , str_result.data(),*result_len);
    	(*ch_result)[*result_len]=0;
    
    	str_result.erase();
    //mutex hier ende?
    }
    


  • Eieiei...

    Der gezeigte Code ist in dem Sinne "threadsafe" (*) dass mehrere Threads gleichzeitig getStr aufrufen können, solange alle Threads dafür sorgen dass ...
    😉 die übergebenen "const" Zeiger alle auf Daten Zeigen die während die Funktion läuft nicht von anderen Threads verändert werden können und
    😉 die übergebenen "nicht const" Zeiger alle auf Daten Zeigen die während die Funktion läuft von anderen Threads weder verändert noch gelesen werden können

    Das sind auch "die üblichen Garantien" die man von einem Aufrufer erwartet, sogesehen könnte man also sagen: ja, ist OK.

    Ist in der Kopierroutine irgendetwas nicht thread-sicheres?

    Ob eine/ein Funktion/Routine/Algorithmus "threadsafe" ist kann man grundsätzlich nur beurteilen wenn man weiss welche Daten gemeinsam genutzt werden, und welche Synchronisierungsmechanismen evtl. vorhandene andere Programmteile verwenden die auf die selben "gemeinsam genutzten" Daten zugreifen.

    Wenn man davon ausgeht dass ein(e) Funktion/Routine/Algorithmus immer nur auf Daten zugreift die nicht gemeinsam genutzt werden ist sie/er immer "threadsafe".

    ----

    (*): Ansonsten... ob 'new', 'memcpy' und lokale Instanzen von std::string "threadsafe" sind kann dir nur die Doku der verwendeten Standard Library bzw. des Compilers sagen. 'new' ist z.B. oft NICHT threadsafe wenn man mit den falschen Optionen compiliert. 'memcpy' ist fast immer threadsafe, weil 'memcpy' normalerweise "stateless" ist, d.h. keine globalen oder statischen Variablen verwendet. Lokale Instanzen von std::string sind auch fast immer OK, es gibt allerdings AFAIK einige schräge Implementierungen wo das nicht so ist.



  • hustbaer schrieb:

    Wenn man davon ausgeht dass ein(e) Funktion/Routine/Algorithmus immer nur auf Daten zugreift die nicht gemeinsam genutzt werden ist sie/er immer "threadsafe".

    Das heist aber auch, dass sie keine globalen/statischen Variablen verwendet. Nicht nur die übergebenen Parameter dürfen nicht gemeinstam genutzt werden.



  • Hinweis schrieb:

    hustbaer schrieb:

    Wenn man davon ausgeht dass ein(e) Funktion/Routine/Algorithmus immer nur auf Daten zugreift die nicht gemeinsam genutzt werden ist sie/er immer "threadsafe".

    Das heist aber auch, dass sie keine globalen/statischen Variablen verwendet. Nicht nur die übergebenen Parameter dürfen nicht gemeinstam genutzt werden.

    Ja natürlich heisst es das auch, globale Variablen wären ja wohl "gemeinsam genutzte Daten" und schlagen sich damit mit der Vorderung oben.


Anmelden zum Antworten