私はshared_ptrでラップされたリソース "resource"を持っていて、他のスレッドからアクセスしたいと思っています。 私がこれをするとき:C++ return function lock_guard
// foo.h
class Foo{
public:
std::shared_ptr<Setup> GetSomeThing();
void SetSomeThing();
private:
std::shared_ptr<Setup> resource;
std::mutex lock;
}
//Foo.cpp
std::shared_ptr<Setup> Foo::GetSomeThing()
{
std::lock_guard<std::mutex> lock (mutex);
return resource;
}
void Foo::SetSomeThing()
{
std::lock_guard<std::mutex> lock (mutex);
resource = ...;
}
それは大丈夫ですか? いつ返品オブジェクトが作成され、いつロックが破棄されるのですか?それはドキュメントの中に何か存在するのでしょうか? ありがとうございました!
「ロック」はスコープ出口で破棄されるため、完全に無意味です。その代わりにthreadを呼び出すと、このロックが作成され、 'Foo :: GetSomeThing'が呼び出され、' lock'がまだ生きている間に同じ(または内部の)スコープで何かが処理されます。 – VTT
すべてのスレッド間で共通のミューテックスを使用する必要があります。また、すべてのスレッドでlock_guardなどを使用する必要があります。例えばFooはstd :: mutex _mtxResourceを持っていなければなりません。次にstd :: lock_guard lock(foo._mtxResource);どこのスレッドでもリソースを使用する必要があります。 –
@VTTコード例をもう一度見てください)それはまだ無意味ですか? – voltento