マルチスレッド アプリケーションのどこからでもアクセスできるいくつかの設定クラスを作成しています。私はこれらの設定を非常に頻繁に読み取ります (読み取りアクセスは高速である必要があります) が、頻繁に書き込まれるわけではありません。
プリミティブ データ型の場合、必要なものを提供しているように見えるboost::atomic
ので、次のようなものを思いつきました。
class UInt16Setting
{
private:
boost::atomic<uint16_t> _Value;
public:
uint16_t getValue() const { return _Value.load(boost::memory_order_relaxed); }
void setValue(uint16_t value) { _Value.store(value, boost::memory_order_relaxed); }
};
質問 1:メモリの順序がわかりません。私のアプリケーションでは、メモリの順序はあまり気にしないと思います (そうですか?)。getValue()
が常に破損していない値 (古い値または新しい値) を返すことを確認したいだけです。私のメモリ順序設定は正しいですか?
質問 2:このアプローチはboost::atomic
、この種の同期に推奨されますか? または、より優れた読み取りパフォーマンスを提供する他の構成要素はありますか?
std::string
また、アプリケーションでは、s のリストなど、より複雑な設定タイプが必要になりますboost::asio::ip::tcp::endpoint
。これらの設定値はすべて不変であると考えています。したがって、 を使用して値を設定するsetValue()
と、値自体 (std::string
またはエンドポイントのリスト自体) は変更されなくなります。繰り返しますが、古い値または新しい値のいずれかを取得することを確認したいだけですが、破損した状態ではありません。
質問 3:このアプローチは で機能しboost::atomic<std::string>
ますか? そうでない場合、代替手段は何ですか?
質問 4:エンドポイントのリストなど、より複雑な設定タイプはどうですか? のようなものをお勧めしますboost::atomic<boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>>>
か? そうでない場合、何が良いでしょうか?