Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2020-10-16, 12:37
  #13
Medlem
Citat:
Ursprungligen postat av JohannesSnajdare
Btw, så lämnade jag en liten "förbättringspotential" i mitt kodexempel som du nog bör fixa innan du ev. skickar in detta till lärare e.dyl. ;-)

Kodraden:
Kod:
                // se till att tråd två blockas från början
                thread2go.acquire();

kan tas bort om man gör en liten förändring som visar att man förstår hur semaforer funkar ;-)

I all välmening,
JS
Tack, jo, jag ändrade den semaforen till att vara 0 från början i stället.
Men kan inte påstå att jag helt hänger med på varför det inte blir varannan längre även om båda semaforerna skulle vara 1 från början. De tre första raderna blir varannan, sedan kör den två i rad.

Kod:
Thread-1 adds 1 and balance is now : 1
Thread-0 subtracts 1 and balance is now : 0
Thread-1 adds 1 and balance is now : 1
Thread-0 subtracts 1 and balance is now : 0
Thread-0 subtracts 1 and balance is now : -1
Thread-1 adds 1 and balance is now : 0
Thread-1 adds 1 and balance is now : 1

Tack!
Det är ingen inlämningsuppgift utan bara för eget ändamål.
Citera
2020-10-16, 15:32
  #14
Medlem
JohannesSnajdares avatar
Om du testar upprepade gånger med permit=1 på båda kommer du se att den beter sig lite olika från gång till gång - det blir lite slumpartat. Detta beror på att din CPU har fler än en kärna och kan då och då faktiskt köra tråd0 och tråd1 mer eller mindre parallellt.

(Men då det finns en massa andra trådar (i alla andra processer) startade i systemet i varje ögonblick så är det relativt ovanligt att just dina två får körtid exakt samtidigt).

Och så fort som en av de två trådarna plockas bort från exekveringen kommer den andra direkt köra ner sin semafor till 0 och har den väl hamnat att vänta på semaforen kommer det vara väldigt osannolikt att de kommer schemaläggas parallellt igen. Men det *kan* hända


Ponera att du hade kört på en en-kärnig CPU - då hade du alltid sett samma mönster:

tråd0
tråd1
tråd1
tråd0
tråd0
osv

tråd0 startar med permit=1, kör igenom och releasar tråd2-semaforen (som nu får permit=2) och ställer sig sen att vänta på sin acquire - den hade ju bara 1 från början.

tråd1 får nu körtid och hinner då varva igenom två varv och därmed också releasa tråd0-semaforen två gånger.
tråd1 väntar därefter på sin acquire. Tråd0 får nu körtid och varvar två gånger osv osv osv.

(Detta är också det vanligaste mönstret även på fler-kärnig CPU då det är troligast att dina två trådar *inte* får exekveringstid samtidigt i starten)

Om dina trådar *hade* varit _garanterade_ att hela tiden köra på varsin dedikerad kärna och alltid exekverat parallellt så hade de också mycket riktigt kört växelvis:

tråd0
tråd1
tråd0
tråd1


/JS
Citera
2020-10-16, 15:46
  #15
Medlem
Citat:
Ursprungligen postat av JohannesSnajdare
Om du testar upprepade gånger med permit=1 på båda kommer du se att den beter sig lite olika från gång till gång - det blir lite slumpartat. Detta beror på att din CPU har fler än en kärna och kan då och då faktiskt köra tråd0 och tråd1 mer eller mindre parallellt.

(Men då det finns en massa andra trådar (i alla andra processer) startade i systemet i varje ögonblick så är det relativt ovanligt att just dina två får körtid exakt samtidigt).

Och så fort som en av de två trådarna plockas bort från exekveringen kommer den andra direkt köra ner sin semafor till 0 och har den väl hamnat att vänta på semaforen kommer det vara väldigt osannolikt att de kommer schemaläggas parallellt igen. Men det *kan* hända


Ponera att du hade kört på en en-kärnig CPU - då hade du alltid sett samma mönster:

tråd0
tråd1
tråd1
tråd0
tråd0
osv

tråd0 startar med permit=1, kör igenom och releasar tråd2-semaforen (som nu får permit=2) och ställer sig sen att vänta på sin acquire - den hade ju bara 1 från början.

tråd1 får nu körtid och hinner då varva igenom två varv och därmed också releasa tråd0-semaforen två gånger.
tråd1 väntar därefter på sin acquire. Tråd0 får nu körtid och varvar två gånger osv osv osv.

(Detta är också det vanligaste mönstret även på fler-kärnig CPU då det är troligast att dina två trådar *inte* får exekveringstid samtidigt i starten)

Om dina trådar *hade* varit _garanterade_ att hela tiden köra på varsin dedikerad kärna och alltid exekverat parallellt så hade de också mycket riktigt kört växelvis:

tråd0
tråd1
tråd0
tråd1


/JS
Perfekt!
Tack för förklaringen!
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