<div dir="ltr">Έχω μια απορία για την υλοποίηση της lock.Δυστυχώς μετά από αρκετές προσομοιώσεις κατάλαβα ότι κάτι πήγαινε λάθος με την υλοποίηση μου και το επιβεβαίωσα με το DDEBUG του locks_scalability.Το πρόβλημα είναι ότι ακόμα δεν είμαι σίγουρος γιατί είναι λάθος η υλοποίηση και δεν μπορώ πλέον να αντιληφθώ πως θα κάνουμε χρήση της compare and swap (προσπάθησα να βρω εναλλακτικές εντολές του gcc αλλά αν και δούλευαν στο debug έλεγαν ότι έχουν κάποιους περιορισμούς οπότε τις άφησα)<div>
Η υλοποίηση μου βασιζόταν στο εξής : Η compare and swap κάνει swap μόνο όταν το lock είναι oldval αλλά εμείς στο test and set θέλουμε να κάνουμε set κάθε φορά έτσι κι αλλιώς οπότε σκέφτηκα να του δώσω σαν oldval την ίδια την τιμή του lock δηλαδή *lock.</div>
<div>Το μόνο που μπορώ να σκεφτώ είναι ότι το *lock παίρνει την τιμή από την cache ή κάποια μη τρέχουσα τιμή(αν και αμφιβάλλω αφού δηλώνουμε το lock volatile) και συγκρίνεται με την πρόσφατη τιμή στη μνήμη που είναι διαφορετική.Τότε αν είναι locked στην cache και unlocked στη μνήμη τότε τερματίζει η acquire lock αλλά δεν κλειδώνουμε με αποτέλεσμα ο επόμενος να το βρίσκει ξεκλείδωτο οπότε να μπαίνει και αυτός στην κρίσιμη περιοχή.</div>
<div style>Δεν ξέρω αν η παραπάνω είναι η σωστή εξήγηση οπότε μια επιβεβαίωση/διόρθωση είναι ευπρόσδεκτη.</div><div style>Αυτό που δεν καταλαβαίνω είναι πώς θα μετατρέψω την compare and swap σε μια απλή ατομική εντολή set.Ίσως μπορεί κάποιος να δώσει καμιά ιδέα</div>
<div style>Επίσης μια ακόμη ερώτηση είναι αν το release πρέπει να γίνει και αυτό ατομικά ή όχι και αν ναι γιατί;</div><div><div style>Ευχαριστώ πολύ εκ των προτέρων,</div></div><div style>Λάμπρος Φλόκας</div></div>