Avatar billede jakobdo Ekspert
22. maj 2003 - 10:05 Der 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)
Avatar billede soreno Praktikant
22. maj 2003 - 10:19 #1
Du skal passe på med at dele variabler mellem tråde.

Eks.

int tal=5;

tråd1:
  int temp = tal;
  tal++;
(context switch)
tråd2:
  int temp = tal;
  tall++;
  tal = temp;
(context switch)
tråd1:
  tal = temp;

Altså vil tal være lig 6 hvor den burde være 7.

For at sikre sig mod lignende tilfælde skal man benytte synkroniserings teknikker (semaphore, mutex, critical section).
Avatar billede chries Nybegynder
22. maj 2003 - 10:19 #2
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.
Avatar billede arne_v Ekspert
22. maj 2003 - 10:35 #4
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 har ikke en liste.
Avatar billede jakobdo Ekspert
22. maj 2003 - 11:18 #5
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)
Avatar billede olennert Nybegynder
22. maj 2003 - 11:29 #6
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).
Avatar billede olennert Nybegynder
22. maj 2003 - 11:30 #7
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.
Avatar billede arne_v Ekspert
22. maj 2003 - 11:34 #8
int a; /* farlig */
static int b; /* farlig */

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.
Avatar billede segmose Nybegynder
22. maj 2003 - 11:37 #9
For at nævn andre mistænkelige funktion, makroer og variable

tmpnam()

alle der bruger errno.
fx. atof, atoi, atol, strtod, strtol, strtoul.

Potentielt:
va_arg()
Avatar billede arne_v Ekspert
22. maj 2003 - 11:38 #10
strtok_r er ikke ANSI/ISO C men en del af POSIX.

D.v.s. at den bør være på de fleste ikke-Microsoft platforme.
Avatar billede segmose Nybegynder
22. maj 2003 - 11:49 #11
// internal state/ alloc
rand()
asctime(), ctime(), gmtime() and localtime()

der er åbenbart mange flere se fx. http://www.objsw.com/docs/libc_127.html#SEC127 med subtile bieffecter.
Avatar billede jakobdo Ekspert
22. maj 2003 - 11:49 #12
Jeg koder under Linux. Så...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester