In a system for executing database queries, a directed graph of logically
interconnected tasks represents an execution plan for executing a
specified database query. A pair of queues are stored in a computer memory
for each pair of interconnected tasks in the directed graph. One of the
queues in each pair is a down queue for sending requests from a parent
task to a child task, and the other is an up queue for sending replies
from the child task to the parent task. Each queue is a circular buffer
and includes a head pointer that points to a next location in the queue to
be read, and a tail pointer that points to a next location in the queue in
which data can be written. Each task checks that a queue is not full
before writing data into that queue, and checks that the sibling queue is
not empty before reading data from the sibling queue. In addition, a task
updates the tail pointer for a queue only after it has written data into
the location in the queue to which the tail pointer is updated, to ensure
that the other task does not attempt to read that queue location until the
new data has been written into it. This queue protocol is sufficient, by
itself, to ensure that tasks do not make conflicting use of the queues,
despite the fact that the queues are in shared memory and are not
protected by a synchronization mechanism.
Σε ένα σύστημα για τις ερωτήσεις βάσεων δεδομένων, μια κατευθυνόμενη γραφική παράσταση των λογικά διασυνδεμένων στόχων αντιπροσωπεύει ένα σχέδιο εκτέλεσης για την εκτέλεση μιας διευκρινισμένης ερώτησης βάσεων δεδομένων. Ένα ζευγάρι των σειρών αναμονής αποθηκεύεται σε μια μνήμη υπολογιστών για κάθε ζευγάρι των διασυνδεμένων στόχων στην κατευθυνόμενη γραφική παράσταση. Μια από τις σειρές αναμονής ανά κάθε ζευγάρι είναι μια κάτω σειρά αναμονής για την αποστολή των αιτημάτων από έναν στόχο γονέων σε έναν στόχο παιδιών, και άλλη είναι μια επάνω σειρά αναμονής για την αποστολή των απαντήσεων από το στόχο παιδιών στο στόχο γονέων. Κάθε σειρά αναμονής είναι ένας κυκλικός απομονωτής και περιλαμβάνει έναν επικεφαλής δείκτη που δείχνουν μια επόμενη θέση στη σειρά αναμονής που διαβάζεται, και έναν δείκτη ουρών που δείχνει μια επόμενη θέση στη σειρά αναμονής στην οποία τα στοιχεία μπορούν να γραφτούν. Κάθε στόχος ελέγχει ότι μια σειρά αναμονής δεν είναι πλήρης πρίν γράφει τα στοιχεία σε εκείνη την σειρά αναμονής, και ελέγχει ότι η σειρά αναμονής αμφιθαλών δεν είναι κενή πρίν διαβάζει τα στοιχεία από τη σειρά αναμονής αμφιθαλών. Επιπλέον, ένας στόχος ενημερώνει το δείκτη ουρών για μια σειρά αναμονής μόνο αφού έχει γράψει τα στοιχεία στη θέση στη σειρά αναμονής στην οποία ο δείκτης ουρών ενημερώνεται, ώστε να εξασφαλιστεί ότι ο άλλος στόχος δεν προσπαθεί να διαβάσει ότι η θέση σειρών αναμονής μέχρι τα νέα στοιχεία έχει γραφτεί σε τον. Αυτό το πρωτόκολλο σειρών αναμονής είναι επαρκές, από το, ώστε να εξασφαλιστεί ότι οι στόχοι δεν κάνουν τη συγκρουόμενη χρήση των σειρών αναμονής, παρά το γεγονός ότι οι σειρές αναμονής είναι στην κοινή μνήμη και δεν προστατεύονται από έναν μηχανισμό συγχρονισμού.