Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Membuat Jenis Alih dengan Mutex Dalaman dalam C?

Bagaimana untuk Membuat Jenis Alih dengan Mutex Dalaman dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-12-05 11:01:11754semak imbas

How to Make a Movable Type with Internal Mutexes in C  ?

Berurusan dengan Mutex dalam Jenis Alih dalam C

Seperti yang anda nyatakan, std::mutex tidak boleh dialihkan mahupun boleh disalin, memberikan cabaran apabila bekerja dengan kelas yang memegang mutex. Untuk membuat jenis boleh alih sambil mengekalkan keselamatan benang, pertimbangkan pendekatan berikut:

Move Constructor

Buat pembina bergerak yang mengunci muteks objek yang dialihkan daripada (a) menggunakan WriteLock:

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

Alih Tugasan

Pengendali tugasan pindah adalah lebih rumit, seperti yang lain benang mungkin mengakses sama ada lhs atau rhs 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;
}

Pembina Salin

Jika anda perlu menyokong semantik salinan, buat pembina salinan yang mengunci mutex objek yang sedang disalin daripada (a) menggunakan ReadLock:

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

Salin Tugasan

Jika anda juga memerlukan operator tugasan salinan, ikut corak yang serupa:

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

Nota Tambahan

Melindungi ahli dan fungsi percuma yang mengakses keadaan kelas adalah penting untuk keselamatan benang. Sebagai contoh, berikut ialah fungsi swap:

friend void swap(A& x, A& y) {
  if (&x != &y) {
    WriteLock lhs_lk(x.mut_, std::defer_lock);
    WriteLock rhs_lk(y.mut_, std::defer_lock);
    std::lock(lhs_lk, rhs_lk);
    using std::swap;
    swap(x.field1_, y.field1_);
    swap(x.field2_, y.field2_);
  }
}

Akhir sekali, ingat bahawa std::shared_timed_mutex dalam C 14 membenarkan pengoptimuman yang mungkin dalam situasi di mana beberapa utas cuba membina-salin daripada objek yang sama.

Atas ialah kandungan terperinci Bagaimana untuk Membuat Jenis Alih dengan Mutex Dalaman dalam C?. 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