私は、さまざまな種類のツール(GCC、LEX、YACC、...)を表すクラスを持っています。 各インスタンスにはツールを表す型が与えられ、特別な構成が許可されます。C++でスレッドセーフなメソッドを実装する適切な方法11
デフォルトの設定を処理するために、マップとベクトルのデフォルト値を格納しています。私は、そのクラスは、すべてのコンテキストで使用できるようにしたいと、それは私が次のことを実施し、レースを回避すること、スレッドセーフでなければならないであろう。
int Tool::addType(std::string typeName,
std::string typeFlagName)
throw (GP::Exceptions::LockAcquisitionException)
{
static std::timed_mutex mutex;
std::unique_lock<std::timed_mutex> lock{mutex};
int typeId = 0;
if (lock.try_lock_for(std::chrono::microseconds(100)))
{
int typeId = typeNames.size();
typeNames[typeId] = typeName;
typeFlagNames[typeId] = typeFlagName;
}
else
{
throw GP::Exceptions::LockAcquisitionException{"Unable to generate new type ID within 100 microseconds."};
}
return typeId;
}
これは良い解決策である場合、または場合、私は知りたいのですが私は何かが恋しい。 これで問題が解決しない場合は、もう少し冗長な解決策がありますか?
それは同時にタイプを追加すると二つの別々のスレッドを防ぐことができますが、それは* *他のスレッドと同時にタイプを追加することから、一つのスレッドを防ぐことはできませんタイプを取得しようとしています。それは私にとっては安全ではないようです。 。 。 – ruakh
私はruakhに同意します。あなたは、オブジェクト全体とすべてのメンバー呼び出しのためのstd :: mutexメンバーを持つべきです。次に、単純なstd :: lock_guardを使用してください。 – Lalaland
タイプは変更されず、1つだけ追加されます。読み取りアクセスによって競合状態が発生することはありません。 – Geoffroy