複数のリーダー スレッドと 1 つのライター スレッドがあり、リーダーが少し古いデータを読み取ることができるシナリオでは、以下に示すように、最も基本的な形式の疑似コードでロックレス制御フローを作成しました。
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
、このスキームは完全に安全です。
それとも私は何かを見落としていますか?そうでない場合は、これはよく知られていることだと確信しており、適切な用語を知りたいので、このアプローチを他の人に説明/推奨するときにそれを使用できます。