• 1
  • 2
2022-01-07, 07:26
  #13
Medlem
Utver det s verkar TS utg frn att han hller p med ett objekt orienterat sprk, C r procedurellt (ven om det gr simulera objekt orientering, frsta C++ versionerna var en preprocessor till C som gjorde just det).

S hela tnket med stack.push()/pop() r felaktigt i ett C kontext, det finns ingen stack implementation i standard biblioteket fr C vad jag kan minnas p rak arm (var dock ett tag sedan jag skrev C) men det finns i de flesta un*x och glibc se queue.h

Fr C++ har du redan std::vector (och varianter av denna).
Citera
2022-01-07, 14:25
  #14
Medlem
kaks avatar
Citat:
Ursprungligen postat av JohnnyMnemonic
Du anvnder static fr temp variabeln helt i ondan, det gr att den inte r reentrant.

Trdsker r inte funktionen oavsett vilket.

-
Edit:
Fr att frtydliga funktioner kan vara trdskra men inte reentranta och vice versa, kombinationen av de bda eller inget av dom.
Precis. Utan static hade det ju varit trdskert s lnge olika trdar inte arbetar mot samma stackinstans.
Fr att kunna arbeta mot samma stack frn flera trdar krvs dock att stora delar av koden skyddas av diverse lsmekanismer eller skrivs lock-free. Ngot som inte r trivialt att f korrekt.

Sjlva infrandet av static-variabel var ju dessutom ondigt.
Det gjordes fr att skydda mot oavsiktlig modifiering av innehllet genom att returnera en kopia.
Den ursprungliga funktionen gjorde ju redan detta d den gjorde return-by-value till skillnad frn den modifierade varianten.

Sen r ju den ursprungliga koden inte ngot under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristflliga returkoder. T.ex br ju push meddela ifall det misslyckas. Dr det rapporteras fel sker det med in-band signalering s att du inte kan lagra MIN_INT p stacken.
Citera
2022-01-07, 15:57
  #15
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av kak
Sen r ju den ursprungliga koden inte ngot under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristflliga returkoder. T.ex br ju push meddela ifall det misslyckas. Dr det rapporteras fel sker det med in-band signalering s att du inte kan lagra MIN_INT p stacken.
Bristen p elegans samt ofullstndigheten beror vl p att kodsnutten snarare br ses som ett pedagogiskt exempel, tillsammans med lite teori och motsvarande kod fr lnkade listor. Bra fr oss som inte r C-gurus, i alla fall.
Citera
2022-01-07, 15:59
  #16
Medlem
Citat:
Ursprungligen postat av bosscs2
Om man vill ta bort sista indexet i en array anvnder man pop() men det verkar inte fungera?

Kod:
double arr[2] = {3,2,1};
arr.pop();
ERROR: expression must have class type but have double
Om du vill anvnda funktioner p en array mste du deklarera den med vector<double> arr istllet fr double arr[2]. Man kan inte anvnda funktioner genom att anropa en fundamental-typ-array. vector<double> r en container fr double-array, som innehller funktioner fr att modifiera arrayen.
Citera
2022-01-07, 19:40
  #17
Medlem
Citat:
Ursprungligen postat av kak
Precis. Utan static hade det ju varit trdskert s lnge olika trdar inte arbetar mot samma stackinstans.
Fr att kunna arbeta mot samma stack frn flera trdar krvs dock att stora delar av koden skyddas av diverse lsmekanismer eller skrivs lock-free. Ngot som inte r trivialt att f korrekt.

Sjlva infrandet av static-variabel var ju dessutom ondigt.
Det gjordes fr att skydda mot oavsiktlig modifiering av innehllet genom att returnera en kopia.
Den ursprungliga funktionen gjorde ju redan detta d den gjorde return-by-value till skillnad frn den modifierade varianten.

Sen r ju den ursprungliga koden inte ngot under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristflliga returkoder. T.ex br ju push meddela ifall det misslyckas. Dr det rapporteras fel sker det med in-band signalering s att du inte kan lagra MIN_INT p stacken.

Jo men trdskerkod har inte premisser som "om du jobbar mot olika stack instanser", trdskerkod tillter att man jobbar mot samma instans s koden r inte trdsker ven om den fungerar i vissa undantagsfall
Citera
2022-01-08, 12:02
  #18
Medlem
kaks avatar
Citat:
Ursprungligen postat av JohnnyMnemonic
Jo men trdskerkod har inte premisser som "om du jobbar mot olika stack instanser", trdskerkod tillter att man jobbar mot samma instans s koden r inte trdsker ven om den fungerar i vissa undantagsfall
Det finns ingen vedertagen definition av vad trdsker innebr. Bda varianterna existerar. T.ex garanterar libxml2 att olika trdar kan arbeta mot olika dokument. Men ls mste infras p applinationsniv om man vill arbeta mot samma dokument. Alternativet hade lett till en oacceptabel prestandafrsmring fr majoriteten av anvndarna.
Om du utvecklar t.ex. en meddelandek s vill du naturligtvis ha trdskerhet enligt den striktare definitionen.
https://en.wikipedia.org/wiki/Thread_safety
Citera
2022-01-08, 15:45
  #19
Medlem
Citat:
Ursprungligen postat av kak
Det finns ingen vedertagen definition av vad trdsker innebr. Bda varianterna existerar. T.ex garanterar libxml2 att olika trdar kan arbeta mot olika dokument. Men ls mste infras p applinationsniv om man vill arbeta mot samma dokument. Alternativet hade lett till en oacceptabel prestandafrsmring fr majoriteten av anvndarna.
Om du utvecklar t.ex. en meddelandek s vill du naturligtvis ha trdskerhet enligt den striktare definitionen.
https://en.wikipedia.org/wiki/Thread_safety

Det r klart det finns en definition av trdsker... och det innebr att en funktion kan anropas frn flera trdar nr som helst, sen kan en funktion vara trdsker i srskilda omstndigheter likt som du beskriver men det r inte pga koden r trdsker utan fr att anvndandet r trdskert.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in