22. maj 2003 - 10:05Der er
9 kommentarer og 3 løsninger
Multithreading, funktioner og lign.
Hej, jeg er jo igang med at kode et lille multithread program, og har hørt rygter om at man skal holde sig væk fra strtok(), er der andre funktion man skal holde sig fra?
Og er der generelle ting man skal tage højde for?
PS: Det haster ikke, min opgave skal først afleveres 28-05-2003 klokken 12.00! :o)
kommer vist lidt an på hvem der har implementeret den. Men hvis man læser dokumentationen fra visual studio, ville jeg nok holde fingrene fra den.
Note Each function uses a static variable for parsing the string into tokens. If multiple or simultaneous calls are made to the same function, a high potential for data corruption and inaccurate results exists. Therefore, do not attempt to call the same function simultaneously for different strings and be aware of calling one of these functions from within a loop where another routine may be called that uses the same function. However, calling this function simultaneously from multiple threads does not have undesirable effects.
Ja der er en del C funktioner du skal være forsigtige med i en multi-threaded sammenhæng.
Alle funktioner som bruger globale variabel (altså ikke kun argumenter og lokale variable) er ikke thread-safe medmindre der bruges noget synkronisering.
Jeg bruger jo thread_create() som opretter en tråd til at håndtere en client! Inden i denne funktion, kaldet ServeClient() er der jo nogle variabler, men der bliver jo oprettet en ny tråd for hver client, så dermed er der vel ikke nogen risiko! (disse variabler er erklæret lokalt)
Jeg kender ikke til Win32-tråde, men for POSIX tråde gælder der at hver tråd har sin egen stak. Så med variabler allokeret lokalt på stakken får hver tråd sin egen kopi. Men lige så snart du deler information mellem trådene er det nødvendigt at låse (med mutex, semafor eller andet).
Lige præcis omkring strtok så findes der i hvert fald på Unix en strtok_r som er trådsikker (forudsat du allokerer din egen char* lokalt på stakken, og bruger adressen af denne i kaldet til strtok_r).
Hvorvidt strtok_r (hvor _r står for reentrant) er Unix-specifik eller ej ved jeg ikke.
int f(int c /*ufarlig */) { int d; /* ufarlig */ static int e; /* farlig */
bemærk dog at c kan være farlig hvis det i virkeligheden er en a,b eller e !
Med hensyn til C library funktioner som du ikke har source kode til skal du enten læse i dokumentation om de er thread safe eller overveje om de evt. bruger nogle a eller b typer internt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.