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

Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Boleh Alih dan Selamat Benang?

Susan Sarandon
Lepaskan: 2024-11-29 06:05:14
asal
687 orang telah melayarinya

How Can I Make My C   Class with a Mutex Movable and Thread-Safe?

Mengendalikan Muteks dalam Jenis Alih dalam C

Isu:

Disebabkan bukan- sifat std::mutex yang boleh disalin dan tidak boleh alih, kelas yang memegang mutex tidak mempunyai pergerakan lalai pembina, menjadikannya mencabar untuk mencipta jenis selamat benang alih.

Penyelesaian:

Untuk mencapai semantik pergerakan selamat benang untuk kelas A yang memegang mutex, pakai yang berikut strategi:

Bergerak Pembina:

A(A&& a) {
    WriteLock rhs_lk(a.mut_); // Lock the rhs mutex
    field1_ = std::move(a.field1_); // Move the data
    field2_ = std::move(a.field2_);
}
Salin selepas log masuk

Operator Tugasan Alih:

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_); // Lock the rhs mutex for reading
    field1_ = a.field1_; // Copy the data
    field2_ = a.field2_;
}
Salin selepas log masuk

Salin Tugasan Operator:

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:

  • Tentukan alias jenis ReadLock dan WriteLock untuk kemudahan.
  • Ingat untuk kunci kedua-dua mutex menggunakan std::lock untuk pengendali tugasan bergerak untuk dielakkan kebuntuan.
  • Pertimbangkan untuk menggunakan std::shared_timed_mutex dalam C 14 untuk membolehkan bacaan serentak.
  • Lindungi sebarang fungsi ahli atau fungsi bebas yang mengakses keadaan dalaman kelas A menggunakan kunci mutex yang sesuai.
  • Jika perlu, tambah kunci ahli data untuk menyimpan objek ReadLock dan WriteLock untuk mengelakkan ahli membina lalai semasa menyalin.

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

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