クラッシュする次のコードがあります。これは、この問題があるスタックへの参照を割り当てているためだと思われます。しかし、毎回ミューテックスとスコープロックをスタック割り当てするコストを回避したい
class Cache {
public:
void createCacheLock(const char* name) {
named_mutex mutex_(open_only, name);
mutex = &mutex_;
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
cache_lock=&cache_lock_ ;
}
void updateCache(const char* name, int newvalue) {
cache_lock->lock() ;
/* Do update work */
cache_lock->unlock() ;
}
private:
named_mutex* mutex ;
scoped_lock<named_mutex>* cache_lock;
}
その後、関数が存在し (cache_lock はクラス フィールドです)、別のクラス メソッド内から cache_lock.lock を呼び出そうとすると、プログラムがクラッシュします (この場合、updateCache は cache_lock->lock() 部分でクラッシュします)。
2 つの質問があります。「永続的な」cache_lock を作成して、named_mutex (open_only など) を呼び出さずに再利用できるようにするにはどうすればよいですか? 毎回これを行うのは避けたい
void updateCache(const char* name, int newvalue) {
named_mutex mutex_(open_only, name);
scoped_lock<named_mutex> cache_lock_(mutex_, defer_lock);
/* Do update work */
cache_lock->unlock() ;
}
次に、上記の手順を繰り返す (つまり、ミューテックスを見つけて、そこからロックを作成する) コストのかかる操作ですか?