ホームページ > バックエンド開発 > C++ > `std::mutex` を含む C 型を安全に移動するには?

`std::mutex` を含む C 型を安全に移動するには?

Barbara Streisand
リリース: 2024-11-30 08:11:10
オリジナル
821 人が閲覧しました

How to Safely Move C   Types Containing `std::mutex`?

Movable C 型でのミューテックスの処理

概要:

C では、移動セマンティクスが強化されていますコピーせずに型を効率的に移動できるようにすることで効率を高めます。ただし、標準のミューテックス (std::mutex) は移動可能でもコピー可能でもないため、ミューテックスを活用する移動対応型の実装には課題が生じます。

問題:

ミューテックスを含むクラス (A) をスレッドセーフで移動可能にするにはどうすればよいですか方法?

解決策:

移動可能にするには、ロック タイプ (ReadLock および WriteLock) を共有ロックまたは一意のロックのエイリアスとして定義します。これらの型を利用して、移動関連操作内のメンバー アクセスを保護します。

移動コンストラクター:

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
ログイン後にコピー

移動代入演算子:

A& operator=(A&& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        WriteLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = std::move(a.field1_);
        field2_ = std::move(a.field2_);
    }
    return *this;
}
ログイン後にコピー

コピーコンストラクター:

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
ログイン後にコピー

コピー代入演算子:

A& operator=(const A& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        ReadLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = a.field1_;
        field2_ = a.field2_;
    }
    return *this;
}
ログイン後にコピー

その他の考慮事項:

  • C でミューテックスを共有することでコピーメンバーを最適化できる14.
  • ロック機構を使用して A の状態を変更する他のメソッドを保護します。
  • スワップの前に等しいかどうかをチェックして自己スワップを防ぎます。
  • read とコピー/移動コンストラクターでのデフォルトの構築を回避するために、ロック データ メンバーを書き込みます。

以上が`std::mutex` を含む C 型を安全に移動するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート