Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2022-01-07, 07:26
  #13
Medlem
Utöver det så verkar TS utgå från att han håller på med ett objekt orienterat språk, C är procedurellt (även om det går simulera objekt orientering, första C++ versionerna var en preprocessor till C som gjorde just det).

Så hela tänket med stack.push()/pop() är felaktigt i ett C kontext, det finns ingen stack implementation i standard biblioteket för 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

För 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 använder static för temp variabeln helt i onödan, det gör att den inte är reentrant.

Trådsäker är inte funktionen oavsett vilket.

—-
Edit:
För att förtydliga funktioner kan vara trådsäkra men inte reentranta och vice versa, kombinationen av de båda eller inget av dom.
Precis. Utan static hade det ju varit trådsäkert så länge olika trådar inte arbetar mot samma stackinstans.
För att kunna arbeta mot samma stack från flera trådar krävs dock att stora delar av koden skyddas av diverse låsmekanismer eller skrivs lock-free. Något som inte är trivialt att få korrekt.

Själva införandet av static-variabel var ju dessutom onödigt.
Det gjordes för att skydda mot oavsiktlig modifiering av innehållet genom att returnera en kopia.
Den ursprungliga funktionen gjorde ju redan detta då den gjorde return-by-value till skillnad från den modifierade varianten.

Sen är ju den ursprungliga koden inte något under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristfälliga returkoder. T.ex bör ju push meddela ifall det misslyckas. Där 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 något under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristfälliga returkoder. T.ex bör ju push meddela ifall det misslyckas. Där det rapporteras fel sker det med in-band signalering så att du inte kan lagra MIN_INT på stacken.
Bristen på elegans samt ofullständigheten beror väl på att kodsnutten snarare bör ses som ett pedagogiskt exempel, tillsammans med lite teori och motsvarande kod för länkade listor. Bra för 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 använder 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 använda funktioner på en array måste du deklarera den med vector<double> arr istället för double arr[2]. Man kan inte använda funktioner genom att anropa en fundamental-typ-array. vector<double> är en container för double-array, som innehåller funktioner för att modifiera arrayen.
Citera
2022-01-07, 19:40
  #17
Medlem
Citat:
Ursprungligen postat av kak
Precis. Utan static hade det ju varit trådsäkert så länge olika trådar inte arbetar mot samma stackinstans.
För att kunna arbeta mot samma stack från flera trådar krävs dock att stora delar av koden skyddas av diverse låsmekanismer eller skrivs lock-free. Något som inte är trivialt att få korrekt.

Själva införandet av static-variabel var ju dessutom onödigt.
Det gjordes för att skydda mot oavsiktlig modifiering av innehållet genom att returnera en kopia.
Den ursprungliga funktionen gjorde ju redan detta då den gjorde return-by-value till skillnad från den modifierade varianten.

Sen är ju den ursprungliga koden inte något under av elegans heller.
1. Inte generisk. Kan enbart hantera integers.
2. Bristfälliga returkoder. T.ex bör ju push meddela ifall det misslyckas. Där det rapporteras fel sker det med in-band signalering så att du inte kan lagra MIN_INT på stacken.

Jo men trådsäkerkod har inte premisser som "om du jobbar mot olika stack instanser", trådsäkerkod tillåter att man jobbar mot samma instans så koden är inte trådsäker även om den fungerar i vissa undantagsfall
Citera
2022-01-08, 12:02
  #18
Medlem
kaks avatar
Citat:
Ursprungligen postat av JohnnyMnemonic
Jo men trådsäkerkod har inte premisser som "om du jobbar mot olika stack instanser", trådsäkerkod tillåter att man jobbar mot samma instans så koden är inte trådsäker även om den fungerar i vissa undantagsfall
Det finns ingen vedertagen definition av vad trådsäker innebär. Båda varianterna existerar. T.ex garanterar libxml2 att olika trådar kan arbeta mot olika dokument. Men lås måste införas på applinationsnivå om man vill arbeta mot samma dokument. Alternativet hade lett till en oacceptabel prestandaförsämring för majoriteten av användarna.
Om du utvecklar t.ex. en meddelandekö så vill du naturligtvis ha trådsäkerhet 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 trådsäker innebär. Båda varianterna existerar. T.ex garanterar libxml2 att olika trådar kan arbeta mot olika dokument. Men lås måste införas på applinationsnivå om man vill arbeta mot samma dokument. Alternativet hade lett till en oacceptabel prestandaförsämring för majoriteten av användarna.
Om du utvecklar t.ex. en meddelandekö så vill du naturligtvis ha trådsäkerhet enligt den striktare definitionen.
https://en.wikipedia.org/wiki/Thread_safety

Det är klart det finns en definition av trådsäker... och det innebär att en funktion kan anropas från flera trådar när som helst, sen kan en funktion vara trådsäker i särskilda omständigheter likt som du beskriver men det är inte pga koden är trådsäker utan för att användandet är trådsäkert.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback