Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Tidak Boleh Alih Kedua-duanya Boleh Alih dan Selamat Benang?

Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Tidak Boleh Alih Kedua-duanya Boleh Alih dan Selamat Benang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 19:22:18727semak imbas

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

Kebolehgerakan Selamat Benang dengan Mutex Tidak Boleh Alih dalam C

Apabila berurusan dengan jenis alih, seperti std::mutex, dalam C pengaturcaraan selamat benang boleh mencabar. Secara lalai, std::mutex tidak boleh alih dan tidak boleh disalin, menghalang penciptaan objek alih selamat benang.

Untuk menjadikan kelas yang mengandungi mutex boleh alih dan mengekalkan keselamatan benang, pertimbangkan pendekatan berikut:

1. Dayakan Kebolehubahan:
Jadikan ahli mutex boleh berubah (cth., mutable std::mutex mut_;) untuk membenarkan pengubahsuaian semasa operasi pemindahan.

2. Move Constructor:
Kunci muteks objek yang dialihkan sebelum menetapkan ahlinya. Ini menghalang rasuah data daripada akses serentak.

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}

3. Operator Tugasan Alih:
Lindungi tugasan pindah menggunakan primitif penyegerakan. Memandangkan akses daripada berbilang rangkaian boleh dilakukan, kunci kedua-dua mutex sebelah kiri (lhs) dan sebelah kanan (rhs) sebelum melaksanakan tugasan.

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;
}

4. Ahli Salin (Pilihan):
Jika ahli salin juga diperlukan, gunakan ReadLock (bukan WriteLock) untuk membenarkan bacaan serentak daripada objek yang disalin.

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}

5 . Pertimbangan Tambahan:

  • Lindungi fungsi ahli lain dan fungsi bebas yang mengakses keadaan kelas dengan penyegerakan yang sesuai untuk mengekalkan keselamatan benang.
  • Pertimbangkan untuk menggunakan std::shared_timed_mutex atau penyegerakan lanjutan lain taip untuk mengoptimumkan untuk senario tertentu dalam C 14 dan kemudian.

Dengan mengikuti garis panduan ini, anda boleh memastikan kelas alih anda kekal selamat untuk benang walaupun menggunakan mutex tidak boleh alih.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Tidak Boleh Alih Kedua-duanya Boleh Alih dan Selamat Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn