Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?

Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?

Barbara Streisand
Lepaskan: 2024-11-30 08:11:10
asal
808 orang telah melayarinya

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

Mengendalikan Mutex dalam Jenis C Movable

Ikhtisar:

Dalam C , gerakkan semantik meningkatkan kecekapan dengan membenarkan jenis dipindahkan dengan cekap tanpa menyalin. Walau bagaimanapun, mutex standard (std::mutex) tidak boleh alih atau boleh disalin, menimbulkan cabaran untuk melaksanakan jenis didayakan alih yang memanfaatkan mutex.

Masalah:

Bagaimanakah kelas (A) yang mengandungi mutex boleh digerakkan dalam peti keselamatan benang cara?

Penyelesaian:

Untuk mendayakan kebolehgerakan, tentukan jenis kunci (ReadLock dan WriteLock) sebagai alias untuk kunci kongsi atau unik. Gunakan jenis ini untuk melindungi akses ahli dalam operasi berkaitan pergerakan.

Move Constructor:

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

Move Assignment Operator:

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

Salin Pembina:

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

Operator Tugasan Salin:

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

Pertimbangan Lain:

  • Ahli salin boleh dioptimumkan dengan berkongsi mutex dalam C 14.
  • Lindungi kaedah lain yang mengubah suai keadaan A dengan mekanisme penguncian.
  • Berjaga-jaga terhadap pertukaran diri dengan menyemak kesaksamaan sebelum menukar.
  • Pertimbangkan untuk menggunakan baca dan tulis ahli data kunci untuk mengelakkan pembinaan lalai dalam pembina salin/pindah.

Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?. 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