自分自身が少し混乱しているので、質問のいくつかの概念を明確にすることから始めます。
コレクション。一般にデータ構造に対して何が起こるかを簡単に尋ねることができるときに、「コレクション」が何を意味するのかを厳密に定義することに時間を費やす理由はないと思います。データ構造はメモリの一部を占有し、そのメモリにアクセスし、ユーザーが呼び出すことができるいくつかの操作があります。これらのユーザーは、個別のプロセッサでも、異なるスレッドでもかまいませんが、私たちには関係ありません。重要なのは、彼らが操作を並行して実行できることです。
ロックフリー。HerlihyとBossは、クラッシュしたユーザーがデータ構造のさらなる使用を妨げない場合、データ構造はロックフリーであると言います。たとえば、ソートされたセットにノードを挿入している最中のプロセッサに水を注ぐことを想像してみてください。まあ、他のプロセッサが後でそのソートされたセットに挿入しようとした場合、それらは成功するはずです。(編集:この定義によれば、データ構造がロックを使用している場合はロックフリーではありませんが、データ構造がロックを使用していない場合はロックフリーではありません。)
これらの定義により、HerlihyとBossは基本的に、重要な地域をトランザクションに変えることが答えだと言っていると思います。
しかし、あなたは尋ねるかもしれません、これは同じ複雑さを持っていますか?質問が意味をなすかどうかはわかりません。考えてくださいpush(x) { lock(); stack[size++] = x; unlock(); }
。これは一定時間の操作ですか?ロック操作を無視して、他のユーザーを無視する場合は、YESと答えることができます。他のユーザーを無視したくない場合、プッシュが一定の時間で実行されるかどうかを判断する方法はありません。レベルを1つ上げて、特定のアルゴリズムでスタックがどのように使用されるかを確認すると、プッシュには常に一定の時間がかかると言えるかもしれません(並列アルゴリズムの入力として何が起こったとしても測定されます)。しかし、それは実際にはアルゴリズムの特性であるため、プッシュ が一定時間の操作であると言っても意味がありません。
要約すると、操作を実行しているユーザーが他のユーザーを待つ時間を無視する場合、クリティカルリージョンの代わりにトランザクションを使用すると、質問に肯定的に答えます。待ち時間を無視しない場合は、データ構造がどのように使用されるかを確認する必要があります。