スレッドセーフと例外セーフである必要があるコードがあります。以下のコードは私の問題の非常に単純化されたバージョンです:C++のデストラクタでミューテックスをロックする11
#include <mutex>
#include <thread>
std::mutex mutex;
int n=0;
class Counter{
public:
Counter(){
std::lock_guard<std::mutex>guard(mutex);
n++;}
~Counter(){
std::lock_guard<std::mutex>guard(mutex);//How can I protect here the underlying code to mutex.lock() ?
n--;}
};
void doSomething(){
Counter counter;
//Here I could do something meaningful
}
int numberOfThreadInDoSomething(){
std::lock_guard<std::mutex>guard(mutex);
return n;}
私はオブジェクトのデストラクタをロックする必要があるミューテックスを持っています。問題は、私のデストラクタが例外をスローするべきではないということです。
どうすればよいですか?
0)私はスピンロック
と私のミューテックスを置き換えることができます)(もちろん、それはここにトリックを行うだろうが、それは私の質問のポイントではありません)アトミック変数で1をn
を置き換えることはできません
2)例外なくロックを取得するまで無限ループにロックをキャッチしようとする可能性があります
これらの解決策はどれも魅力的ではありません。同じ問題がありましたか?どのように解決しましたか?
「オブジェクトのデストラクタにロックする必要のあるミューテックスがある」 - 悪い考えのように思える。解決策を私たちに提供し、問題を解決する代わりに、あなたが解決しようとしている問題を教えてください。そうすれば、より良い解決策を提供することができます。 –
@RobertHarvey私が実際にやりたいことは、データベースに保存された後で変更を共有キャッシュに挿入することです。 – Arnaud