Bagikan melalui


Objek Mutex

Objek mutex adalah objek sinkronisasi yang statusnya diatur ke sinyal ketika tidak dimiliki oleh utas apa pun, dan tidak ditandatangani 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 Antarproses.

Utas dalam proses lain dapat membuka handel ke objek mutex bernama yang ada dengan menentukan namanya dalam panggilan ke fungsi OpenMutex. Untuk meneruskan handel ke mutex yang tidak disebutkan namanya ke proses lain, gunakan fungsiDuplicateHandle 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 merilis objek mutex menggunakan fungsiReleaseMutex. 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 tersebut 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 melepaskan kepemilikannya dalam keadaan seperti itu, utas harus memanggil ReleaseMutex sekali untuk setiap kali mutex memenuhi kondisi fungsi tunggu.

Jika utas dihentikan tanpa melepaskan kepemilikannya atas objek mutex, objek mutex dianggap ditinggalkan. Alur 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