Objek Mutex

Objek mutex adalah objek sinkronisasi yang statusnya diatur ke sinyal ketika tidak dimiliki oleh utas apa pun, dan tidak sejajar saat dimiliki. Hanya satu utas pada satu waktu yang dapat memiliki objek mutex, yang namanya berasal dari fakta bahwa itu berguna dalam mengoordinasikan akses yang saling eksklusif ke sumber daya bersama. Misalnya, untuk mencegah dua utas menulis ke memori bersama secara bersamaan, setiap utas menunggu kepemilikan objek mutex sebelum menjalankan kode yang mengakses memori. Setelah menulis ke memori bersama, utas merilis objek mutex.

Utas menggunakan fungsi CreateMutex atau CreateMutexEx untuk membuat objek mutex. Alur pembuatan dapat meminta kepemilikan langsung objek mutex dan juga dapat menentukan nama untuk objek mutex. Ini juga dapat membuat mutex yang tidak disebutkan namanya. Untuk informasi tambahan tentang nama untuk objek mutex, peristiwa, semaphore, dan timer, lihat Sinkronisasi Interproses.

Utas dalam proses lain dapat membuka handel ke objek mutex bernama yang sudah ada dengan menentukan namanya dalam panggilan ke fungsi OpenMutex . Untuk meneruskan handel ke mutex yang tidak disebutkan namanya ke proses lain, gunakan fungsi DuplicateHandle atau pewarisan handel induk-anak.

Setiap utas dengan handel ke objek mutex dapat menggunakan salah satu fungsi tunggu untuk meminta kepemilikan objek mutex. Jika objek mutex dimiliki oleh utas lain, fungsi tunggu memblokir utas yang diminta hingga utas pemilik melepaskan objek mutex menggunakan fungsi ReleaseMutex . Nilai pengembalian fungsi tunggu menunjukkan apakah fungsi dikembalikan karena beberapa alasan selain status mutex yang diatur ke sinyal.

Jika lebih dari satu utas menunggu pada mutex, utas tunggu dipilih. Jangan asumsikan urutan first-in, first-out (FIFO). Peristiwa eksternal seperti APC mode kernel dapat mengubah urutan tunggu.

Setelah utas mendapatkan kepemilikan mutex, utas dapat menentukan mutex yang sama dalam panggilan berulang ke fungsi tunggu tanpa memblokir eksekusinya. Ini mencegah utas dari kebuntuan itu sendiri sambil menunggu mutex yang sudah dimilikinya. Untuk merilis kepemilikannya dalam keadaan seperti itu, utas harus memanggil ReleaseMutex sekali untuk setiap kali mutex memenuhi kondisi fungsi tunggu.

Jika utas berakhir tanpa melepaskan kepemilikannya atas objek mutex, objek mutex dianggap ditinggalkan. Utas tunggu dapat memperoleh kepemilikan objek mutex yang ditinggalkan, tetapi fungsi tunggu akan mengembalikan WAIT_ABANDONED untuk menunjukkan bahwa objek mutex ditinggalkan. Objek mutex yang ditinggalkan menunjukkan bahwa kesalahan telah terjadi dan bahwa sumber daya bersama apa pun yang dilindungi oleh objek mutex berada dalam status tidak terdefinisi. Jika utas berlanjut seolah-olah objek mutex belum ditinggalkan, utas tidak lagi dianggap ditinggalkan setelah utas merilis kepemilikannya. Ini memulihkan perilaku normal jika handel ke objek mutex kemudian ditentukan dalam fungsi tunggu.

Perhatikan bahwa objek bagian penting menyediakan sinkronisasi yang mirip dengan yang disediakan oleh objek mutex, kecuali bahwa objek bagian penting hanya dapat digunakan oleh utas dari satu proses.

Menggunakan Objek Mutex