それを「ロック」と考えるのではなく、所有権の別のシェアを取得するだけであることに注意してください。ウィークポインタ自体は何も所有していないため、直接使用することはできません。
弱ポインタの一般的な使用法は、おそらく並行コードにあります。どこかに共有ポインタが所有するオブジェクトのコレクションがあるとします。次に、それらの同じオブジェクトを参照する弱いポインターの別のコレクション(タイマーのコレクションなど)を作成できます。2番目のスレッドは、弱いポインターを取得し、そこから共有ポインターを作成しようとします。呼び出しが成功すると、たとえば、オブジェクトのタイマールーチンが呼び出されます。その時点でタスクがすでに終了している場合、共有ポインターはnullになり、2番目のスレッドはタスクをスキップします。
についての重要な事実std::shared_ptr
は、その内部参照カウントがアトミックに更新されるため、私が説明した方法でコードを記述でき、レースフリーになるということです。
Thread 1 Thread 2
-------- --------
std::set<std::shared_ptr<Task>> std::list<std::weak_ptr<Task>> todo;
add
remove for (auto wp : todo)
if (auto p = wp.lock())
p->do_work();