Menyinkronkan Eksekusi Beberapa Utas

Untuk menghindari kondisi balapan dan kebuntuan, perlu untuk menyinkronkan akses oleh beberapa utas ke sumber daya bersama. Sinkronisasi juga diperlukan untuk memastikan bahwa kode yang saling diperlukan dijalankan dalam urutan yang tepat.

Ada sejumlah objek yang handelnya dapat digunakan untuk menyinkronkan beberapa utas. Objek-objek ini meliputi:

  • Buffer input konsol
  • Acara
  • Mutex
  • Proses
  • Semaphores
  • Threads
  • Timer

Status masing-masing objek ini disinyalir atau tidak disinyalir. Saat Anda menentukan handel ke salah satu objek ini dalam panggilan ke salah satu fungsi tunggu, eksekusi utas panggilan diblokir hingga status objek yang ditentukan menjadi sinyal.

Beberapa objek ini berguna dalam memblokir utas hingga beberapa peristiwa terjadi. Misalnya, handel buffer input konsol disinyalir ketika ada input yang belum dibaca, seperti tombol penekanan tombol atau klik tombol mouse. Handel proses dan utas disinyalir ketika proses atau utas berakhir. Ini memungkinkan proses, misalnya, untuk membuat proses anak dan kemudian memblokir eksekusinya sendiri sampai proses baru dihentikan.

Objek lain berguna dalam melindungi sumber daya bersama dari akses bersamaan. Misalnya, beberapa utas masing-masing dapat memiliki handel ke objek mutex. Sebelum mengakses sumber daya bersama, utas harus memanggil salah satu fungsi tunggu untuk menunggu status mutex disinyalkan. Ketika mutex menjadi sinyal, hanya satu utas tunggu yang dirilis untuk mengakses sumber daya. Status mutex segera diatur ulang agar tidak diberi sinyal sehingga utas tunggu lainnya tetap diblokir. Ketika utas selesai dengan sumber daya, utas harus mengatur status mutex ke sinyal untuk memungkinkan utas lain mengakses sumber daya.

Untuk utas dari satu proses, objek bagian kritis menyediakan cara sinkronisasi yang lebih efisien daripada mutex. Bagian penting digunakan seperti mutex untuk mengaktifkan satu utas pada satu waktu untuk menggunakan sumber daya yang dilindungi. Utas dapat menggunakan fungsi EnterCriticalSection untuk meminta kepemilikan bagian penting. Jika sudah dimiliki oleh utas lain, utas yang meminta akan diblokir. Utas dapat menggunakan fungsi TryEnterCriticalSection untuk meminta kepemilikan bagian penting, tanpa memblokir kegagalan untuk mendapatkan bagian penting. Setelah menerima kepemilikan, utas bebas menggunakan sumber daya yang dilindungi. Eksekusi utas lain dari proses tidak terpengaruh kecuali mereka mencoba memasuki bagian kritis yang sama.

Fungsi WaitForInputIdle membuat utas menunggu hingga proses tertentu diinisialisasi dan menunggu input pengguna tanpa input tertunda. Memanggil WaitForInputIdle dapat berguna untuk menyinkronkan proses induk dan anak, karena CreateProcess kembali tanpa menunggu proses anak menyelesaikan inisialisasinya.

Untuk informasi selengkapnya, lihat Sinkronisasi.