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
Lepaskan: 2024-12-05 19:22:18
asal
715 orang telah melayarinya

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_);
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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_;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan