GNU/Linux >> Belajar Linux >  >> Linux

Kesalahan pernyataan pthread mutex

TLDR:Pastikan Anda tidak mengunci mutex yang telah dihancurkan/belum diinisialisasi.

Meskipun OP memiliki jawabannya, saya pikir saya akan membagikan masalah saya jika ada orang lain yang memiliki masalah yang sama dengan saya.

Perhatikan bahwa pernyataan ada di __pthread_mutex_lock dan tidak di unlock. Ini, bagi saya, menunjukkan bahwa kebanyakan orang yang mengalami masalah ini tidak membuka kunci mutex di utas yang berbeda dari yang menguncinya; mereka hanya mengunci mutex yang telah dihancurkan.

Bagi saya, saya punya kelas (sebut saja Foo ) yang mendaftarkan fungsi panggilan balik statis dengan beberapa kelas lain (sebut saja Bar ). Callback sedang diteruskan referensi ke Foo dan terkadang akan mengunci/membuka kunci mutex yang merupakan anggota dari Foo .

Masalah ini terjadi setelah Foo instance dihancurkan sementara Bar instance masih menggunakan callback. Callback sedang meneruskan referensi ke objek yang sudah tidak ada lagi dan, oleh karena itu, memanggil __pthread_mutex_lock pada memori sampah.

Catatan, saya menggunakan std::mutex C++11 dan std::lock_guard<std::mutex> , tetapi, karena saya menggunakan Linux, masalahnya persis sama.


Batu padat selama 4 hari berturut-turut. Saya menyatakan kemenangan untuk yang satu ini. Jawabannya adalah "kesalahan pengguna bodoh" (lihat komentar di atas). Mutex hanya boleh dibuka oleh utas yang menguncinya. Terima kasih telah mendukung saya.


Saya dihadapkan dengan masalah yang sama dan google mengirim saya ke sini. Masalah dengan program saya adalah bahwa dalam beberapa situasi saya tidak menginisialisasi mutex sebelum menguncinya.

Meskipun pernyataan dalam jawaban yang diterima itu sah, menurut saya itu bukan penyebab dari pernyataan yang gagal ini. Karena kesalahan dilaporkan pada pthread_mutex_lock (dan tidak buka kunci).

Selain itu, seperti biasa, kesalahan lebih mungkin terjadi pada kode sumber pemrogram daripada kompiler.


Linux
  1. Dpkg-deb:Kesalahan:Tempel Subproses Dibunuh Oleh Sinyal (Pipa rusak) Nginx?

  2. Tabel Kesalahan MySQL 'mysql.servers' tidak ada

  3. pthreads mutex vs semaphore

  1. kesalahan autoconf di ubuntu 11.04

  2. Apa :-!! dalam kode C?

  3. Ganti nama basis data MySQL

  1. Kisah Linux keluarga saya

  2. 3 rilis Linux favorit saya

  3. Kesalahan I/O di Linux:tidak dapat menghapus direktori sebagai root