<div dir="ltr">Salut,<div><br></div><div>Nu imi este foarte clar codul ce se execută atunci când un procesor cedează un spinlock de tip MCS. (Curs 5, slide 28 [1])</div><div><br></div><div>Mai exact, nu îmi este clar de ce face acel <span style="color:rgb(0,0,0);font-family:"courier new";text-indent:48px;white-space:pre-wrap">while (!(next = node->next))</span> în următoarea secvență de cod:</div><div><span id="gmail-docs-internal-guid-6acba9dd-3449-6905-339e-afa46108a52f"><p dir="ltr" style="line-height:1.3375;margin-top:0pt;margin-bottom:0pt"><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">next = node->next;</span></p><p dir="ltr" style="line-height:1.3375;margin-top:0pt;margin-bottom:0pt"><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">if (!next){ </span></p><p dir="ltr" style="line-height:1.3375;margin-top:0pt;margin-bottom:0pt;text-indent:36pt"><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">if (cmpxchg(lock, node, NULL) == node) return;</span></p><p dir="ltr" style="line-height:1.3375;margin-top:0pt;margin-bottom:0pt;text-indent:36pt"><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">while (!(next = node->next)) ;</span></p><p dir="ltr" style="line-height:1.3375;margin-top:0pt;margin-bottom:0pt"><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">}</span></p><span style="font-family:"courier new";color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap">next->locked = 1; /* pass access to the first CPU waiting */</span></span><br></div><div><br></div><div>Din ce înteleg de aici [2], se ajunge la bucata respectivă de cod dacă există și alt procesor care așteaptă după lock, caz în care procesorul curent "cedează" lock-ul următorului procesor care așteaptă în coadă.</div><div>Mă gândesc că acea secvență de cod se execută doar când un alt procesor încearcă să ia lock-ul și este adăugat în listă (cazul 2, slide 27 [1]) concomitent cu eliberarea lock-ului de către primul, doar că nu înțeleg care e rolul și ce verifică mai exact acel while.</div><div><br></div><div>Mersi frumos,</div><div>Elena</div><div><br></div><div>[1] <a href="https://ocw.cs.pub.ro/courses/so2/cursuri/curs05">https://ocw.cs.pub.ro/courses/so2/cursuri/curs05</a></div><div>[2] <a href="https://lwn.net/Articles/590243/">https://lwn.net/Articles/590243/</a></div></div>