Kelas CMultiLock
Mewakili mekanisme kontrol akses yang digunakan dalam mengontrol akses ke sumber daya dalam program multithreaded.
Sintaks
class CMultiLock
Anggota
Konstruktor Publik
Nama | Deskripsi |
---|---|
CMultiLock::CMultiLock | Membuat CMultiLock objek. |
Metode Publik
Nama | Deskripsi |
---|---|
CMultiLock::IsLocked | Menentukan apakah objek sinkronisasi tertentu dalam array dikunci. |
CMultiLock::Lock | Menunggu array objek sinkronisasi. |
CMultiLock::Buka kunci | Merilis objek sinkronisasi yang dimiliki. |
Keterangan
CMultiLock
tidak memiliki kelas dasar.
Untuk menggunakan kelas sinkronisasi CSemaphore, CMutex, dan CEvent, Anda dapat membuat CMultiLock
objek atau CSingleLock untuk menunggu dan merilis objek sinkronisasi. Gunakan CMultiLock
ketika ada beberapa objek yang dapat Anda gunakan pada waktu tertentu. Gunakan CSingleLock
saat Anda hanya perlu menunggu pada satu objek pada satu waktu.
Untuk menggunakan CMultiLock
objek, pertama-tama buat array objek sinkronisasi yang ingin Anda tunggu. Selanjutnya, panggil CMultiLock
konstruktor objek di dalam fungsi anggota di kelas sumber daya terkontrol. Kemudian panggil fungsi Kunci anggota untuk menentukan apakah sumber daya tersedia (disinyalir). Jika salah satunya adalah, lanjutkan dengan sisa fungsi anggota. Jika tidak ada sumber daya yang tersedia, tunggu hingga jumlah waktu tertentu untuk sumber daya dirilis, atau kembalikan kegagalan. Setelah penggunaan sumber daya selesai, panggil fungsi Buka kunci jika CMultiLock
objek akan digunakan lagi, atau izinkan CMultiLock
objek dihancurkan.
CMultiLock
objek paling berguna ketika utas memiliki sejumlah CEvent
besar objek yang dapat ditanggapinya. Buat array yang berisi semua CEvent
pointer, dan panggil Lock
. Ini akan menyebabkan utas menunggu sampai salah satu peristiwa disinyalir.
Untuk informasi selengkapnya tentang cara menggunakan CMultiLock
objek, lihat artikel Multithreading: Cara Menggunakan Kelas Sinkronisasi.
Hierarki Warisan
CMultiLock
Persyaratan
Header: afxmt.h
CMultiLock::CMultiLock
Membuat CMultiLock
objek.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parameter
ppObjects
Array pointer ke objek sinkronisasi yang akan ditunggu. Tidak boleh NULL.
dwCount
Jumlah objek dalam ppObjects. Harus lebih besar dari 0.
bInitialLock
Menentukan apakah awalnya mencoba mengakses salah satu objek yang disediakan.
Keterangan
Fungsi ini dipanggil setelah membuat array objek sinkronisasi yang akan ditunggu. Biasanya dipanggil dari dalam utas yang harus menunggu salah satu objek sinkronisasi tersedia.
CMultiLock::IsLocked
Menentukan apakah objek yang ditentukan tidak ditandatangani (tidak tersedia).
BOOL IsLocked(DWORD dwItem);
Parameter
dwItem
Indeks dalam array objek yang sesuai dengan objek yang statusnya sedang dikueri.
Tampilkan Nilai
Bukan nol jika objek yang ditentukan dikunci; jika tidak, 0.
CMultiLock::Lock
Panggil fungsi ini untuk mendapatkan akses ke satu atau beberapa sumber daya yang dikontrol oleh objek sinkronisasi yang disediakan ke CMultiLock
konstruktor.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
Parameter
dwTimeOut
Menentukan jumlah waktu untuk menunggu objek sinkronisasi tersedia (diberi sinyal). Jika INFINITE, Lock
akan menunggu hingga objek diberi sinyal sebelum kembali.
bWaitForAll
Menentukan apakah semua objek yang ditunggu harus menjadi sinyal pada saat yang sama sebelum kembali. Jika FALSE, Lock
akan kembali ketika salah satu objek yang menunggu disinyalir.
dwWakeMask
Menentukan kondisi lain yang diizinkan untuk membatalkan penantian. Untuk daftar lengkap opsi yang tersedia untuk parameter ini, lihat MsgWaitForMultipleObjects di Windows SDK.
Tampilkan Nilai
Jika Lock
gagal, ia akan mengembalikan - 1. Jika berhasil, nilai mengembalikan salah satu nilai berikut:
Antara WAIT_OBJECT_0 dan WAIT_OBJECT_0 + (jumlah objek - 1)
Jika bWaitForAll TRUE, semua objek disinyalir (tersedia). Jika bWaitForAll adalah FALSE, nilai yang dikembalikan - WAIT_OBJECT_0 adalah indeks dalam array objek objek yang disinyalir (tersedia).
WAIT_OBJECT_0 + (jumlah objek)
Peristiwa yang ditentukan dalam dwWakeMask tersedia dalam antrean input utas.
Antara WAIT_ABANDONED_0 dan WAIT_ABANDONED_0 + (jumlah objek - 1)
Jika bWaitForAll TRUE, semua objek diberi sinyal, dan setidaknya salah satu objek adalah objek mutex yang ditinggalkan. Jika bWaitForAll adalah FALSE, nilai yang dikembalikan - WAIT_ABANDONED_0 adalah indeks dalam array objek objek mutex yang ditinggalkan yang memenuhi penantian.
WAIT_TIMEOUT
Interval batas waktu yang ditentukan dalam dwTimeOut kedaluwarsa tanpa menunggu berhasil.
Keterangan
Jika bWaitForAll TRUE, Lock
akan berhasil kembali segera setelah semua objek sinkronisasi menjadi sinyal secara bersamaan. Jika bWaitForAll false, Lock
akan kembali segera setelah satu atau beberapa objek sinkronisasi menjadi sinyal.
Jika Lock
tidak dapat segera kembali, ia akan menunggu tidak lebih dari jumlah milidetik yang ditentukan dalam parameter dwTimeOut sebelum kembali. Jika dwTimeOut adalah INFINITE, Lock
tidak akan kembali sampai akses ke objek diperoleh atau kondisi yang ditentukan dalam dwWakeMask terpenuhi. Jika tidak, jika Lock
mampu memperoleh objek sinkronisasi, objek tersebut akan berhasil ditampilkan; jika tidak, itu akan mengembalikan kegagalan.
CMultiLock::Buka kunci
Merilis objek sinkronisasi yang dimiliki oleh CMultiLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parameter
lCount
Jumlah jumlah referensi yang akan dilepaskan. Harus lebih besar dari 0. Jika jumlah yang ditentukan akan menyebabkan jumlah objek melebihi maksimumnya, jumlah tidak diubah dan fungsi mengembalikan FALSE.
lPrevCount
Arahkan ke variabel untuk menerima jumlah sebelumnya untuk objek sinkronisasi. Jika NULL, jumlah sebelumnya tidak dikembalikan.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0.
Keterangan
Fungsi ini dipanggil oleh CMultiLock
destruktor.
Bentuk pertama mencoba Unlock
membuka kunci objek sinkronisasi yang dikelola oleh CMultiLock
. Bentuk Unlock
kedua mencoba membuka kunci CSemaphore
objek yang dimiliki oleh CMultiLock
. Jika CMultiLock
tidak memiliki objek terkunci CSemaphore
, fungsi mengembalikan FALSE; jika tidak, fungsi mengembalikan TRUE. lCount dan lpPrevCount sama persis dengan parameter CSingleLock::Unlock. Bentuk Unlock
kedua jarang berlaku untuk situasi multi-blok.