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
Lepaskan: 2024-12-05 11:01:11
asal
748 orang telah melayarinya

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

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

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 selepas log masuk

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

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

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!

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