2

複数のリーダー スレッドと 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、このスキームは完全に安全です。

それとも私は何かを見落としていますか?そうでない場合は、これはよく知られていることだと確信しており、適切な用語を知りたいので、このアプローチを他の人に説明/推奨するときにそれを使用できます。

4

1 に答える 1

1

十分なメモリと書き込みスレッドの総数は、ロックレスにできるものとできないものを決定する基準ではありません

ロックフリー プログラミングの重要な機能の 1 つは、単一のスレッドを中断しても、他のスレッドが独自のロックフリー操作を実行するのを妨げないことです。

しかし、もっと重要なこと: ロックフリーにするために (シングルライターの) コードが準拠する必要がある主な機能は、「順次一貫性」です。

Sequential Consistency とは、「すべてのスレッドがメモリ操作の発生順序に同意し、その順序がプログラム ソース コード内の操作の順序と一致する」ことを意味します。

コードが順次整合性を保証できない場合は、メモリの並べ替えを防止する必要があります。(メモリの並べ替えに関する詳細はこちら: http://preshing.com/20120515/memory-reordering-caught-in-the-act/ )

最後に、ロックフリーのマルチスレッド プログラミングの概念をより深く掘り下げるために、次のリソースを確認することをお勧めし ます 。 -データ構造/184401865

幸運を!

于 2016-06-23T06:19:27.530 に答える