A method for accessing cells of a ring buffer by two or more readers, the ring buffer having a current reader cell position value stored in each of a done reader index as a done reader index value and a reserved reader index as a reserved reader index value, a current writer cell position value stored in a done writer index as a done writer index value, and the current reader cell position value being not equal to the current writer cell position value, the method comprising: for each of the two or more readers: copying the current reader cell position value from the reserved reader index to an old reader variable as an old reader variable value; assigning a trial next reader cell position value to a new reader variable as a new reader variable value; determining whether the trial next reader cell position value is acceptable, the trial next reader cell position value being acceptable only if the trial next reader cell position value as assigned to the new reader variable is not equal to the done writer index value as stored in the done writer index; as an atomic operation, first, determining whether the trial next reader cell position value is acceptable as a next reader cell position value, the trial next reader cell position value being acceptable as the next reader cell position value only if the reserved reader index value is equal to the old reader variable value, and second, replacing the reserved reader index value with the new reader variable value; after completing the atomic operation, reading data from a cell of the ring buffer indicated by the new reader cell position value; and, only when the done reader index value is equal to the old reader variable value, replacing the done reader index value with the new reader variable value; whereby the two or more readers are prevented from simultaneously accessing the cell of the ring buffer. for each of the two or more readers: copying the current reader cell position value from the reserved reader index to an old reader variable as an old reader variable value; assigning a trial next reader cell position value to a new reader variable as a new reader variable value; determining whether the trial next reader cell position value is acceptable, the trial next reader cell position value being acceptable only if the trial next reader cell position value as assigned to the new reader variable is not equal to the done writer index value as stored in the done writer index; as an atomic operation, first, determining whether the trial next reader cell position value is acceptable as a next reader cell position value, the trial next reader cell position value being acceptable as the next reader cell position value only if the reserved reader index value is equal to the old reader variable value, and second, replacing the reserved reader index value with the new reader variable value; after completing the atomic operation, reading data from a cell of the ring buffer indicated by the new reader cell position value; and, only when the done reader index value is equal to the old reader variable value, replacing the done reader index value with the new reader variable value; copying the current reader cell position value from the reserved reader index to an old reader variable as an old reader variable value; assigning a trial next reader cell position value to a new reader variable as a new reader variable value; determining whether the trial next reader cell position value is acceptable, the trial next reader cell position value being acceptable only if the trial next reader cell position value as assigned to the new reader variable is not equal to the done writer index value as stored in the done writer index; as an atomic operation, first, determining whether the trial next reader cell position value is acceptable as a next reader cell position value, the trial next reader cell position value being acceptable as the next reader cell position value only if the reserved reader index value is equal to the old reader variable value, and second, replacing the reserved reader index value with the new reader variable value; after completing the atomic operation, reading data from a cell of the ring buffer indicated by the new reader cell position value; and, only when the done reader index value is equal to the old reader variable value, replacing the done reader index value with the new reader variable value; whereby the two or more readers are prevented from simultaneously accessing the cell of the ring buffer.