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
623 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!

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