对于具有多个读取器线程和单个写入器线程的场景,允许读取器读取稍微过时的数据,我编写了一个无锁控制流,如下所示,其最基本的伪代码形式如下所示:
GLOBAL_ATOMIC_POINTER shared_pointer
// Only called by the reader threads.
read()
THREAD_LOCAL_POINTER read_pointer := shared_pointer
return read_data_at(read_pointer)
// Only called by the writer thread.
write(input)
THREAD_LOCAL_ARRAY array
THREAD_LOCAL_POINTER write_pointer := shared_pointer
if write_pointer == location_of_last_element(array)
write_pointer := location_of_first_element(array)
else
write_pointer := location_of_next_element(array, write_pointer)
write_data_at(write_pointer, input)
shared_pointer := write_pointer
让我们调用MAX_READING_DURATION
一个调用read()
可以完成的最长时间,以及一个调用可以完成MIN_WRITING_DURATION
的最短时间write()
。
现在,shared_pointer
保证是原子的,只要MAX_READING_DURATION < ELEMENT_COUNT(ARRAY) * MIN_WRITING_DURATION
,这个方案应该是完全安全的。
还是我忽略了什么?如果不是,我敢肯定这是众所周知的事情,我想知道正确的术语,所以当我向其他人解释/倡导这种方法时,我可以使用它。