Aracılığıyla paylaş


CMultiLock Sınıfı

Çok iş parçacıklı bir programdaki kaynaklara erişimi denetlemek için kullanılan erişim denetimi mekanizmasını temsil eder.

Sözdizimi

class CMultiLock

Üyeler

Ortak Oluşturucular

Veri Akışı Adı Açıklama
CMultiLock::CMultiLock Bir CMultiLock nesne oluşturur.

Genel Yöntemler

Veri Akışı Adı Açıklama
CMultiLock::IsLocked Dizideki belirli bir eşitleme nesnesinin kilitli olup olmadığını belirler.
CMultiLock::Lock Eşitleme nesneleri dizisini bekler.
CMultiLock::Unlock Sahip olunan tüm eşitleme nesnelerini serbest bırakır.

Açıklamalar

CMultiLock temel sınıfına sahip değildir.

CSemaphore, CMutex ve CEvent eşitleme sınıflarını kullanmak için bir veya CSingleLock nesnesi oluşturarak CMultiLock eşitleme nesnesini bekleyebilir ve serbest bırakabilirsiniz. Belirli bir zamanda kullanabileceğiniz birden çok nesne olduğunda kullanın CMultiLock . Tek seferde yalnızca bir nesnede beklemeniz gerektiğinde kullanın CSingleLock .

Nesne CMultiLock kullanmak için, önce beklemek istediğiniz eşitleme nesnelerinin bir dizisini oluşturun. Ardından, denetlenen kaynağın CMultiLock sınıfında bir üye işlevi içinde nesnesinin oluşturucusunu çağırın. Ardından, bir kaynağın kullanılabilir olup olmadığını (sinyalli) belirlemek için Üyeyi kilitle işlevini çağırın. Varsa, üye işlevinin geri kalanıyla devam edin. Kullanılabilir kaynak yoksa, kaynağın serbest bırakılması için belirli bir süre bekleyin veya hata döndürebilirsiniz. Kaynak kullanımı tamamlandıktan sonra nesne yeniden kullanılacaksa CMultiLock Unlock işlevini çağırın veya nesnenin CMultiLock yok edilmesine izin verin.

CMultiLock nesneler, bir iş parçacığının yanıt verebileceği çok sayıda CEvent nesne olduğunda en kullanışlı olanlardır. Tüm CEvent işaretçileri içeren bir dizi oluşturun ve öğesini çağırın Lock. Bu, iş parçacığının olaylardan biri sinyal alınana kadar beklemesine neden olur.

Nesneleri kullanma CMultiLock hakkında daha fazla bilgi için Çoklu İş Parçacığı Kullanımı: Eşitleme Sınıflarını Kullanma makalesine bakın.

Devralma Hiyerarşisi

CMultiLock

Gereksinimler

Üst bilgi: afxmt.h

CMultiLock::CMultiLock

Bir CMultiLock nesne oluşturur.

CMultiLock(
    CSyncObject* ppObjects [ ],
    DWORD dwCount,
    BOOL bInitialLock = FALSE);

Parametreler

ppObjects
Üzerinde beklenecek eşitleme nesnelerine yönelik işaretçi dizisi. NULL olamaz.

dwCount
ppObjects içindeki nesne sayısı. 0'dan büyük olmalıdır.

bInitialLock
Başlangıçta sağlanan nesnelerden herhangi birine erişmeye çalışılıp denenmeyeceğini belirtir.

Açıklamalar

Bu işlev, beklenecek eşitleme nesneleri dizisi oluşturulduktan sonra çağrılır. Genellikle, eşitleme nesnelerinden birinin kullanılabilir olmasını beklemesi gereken iş parçacığının içinden çağrılır.

CMultiLock::IsLocked

Belirtilen nesnenin imzasız (kullanılamıyor) olup olmadığını belirler.

BOOL IsLocked(DWORD dwItem);

Parametreler

dwItem
Durumu sorgulanan nesneye karşılık gelen nesne dizisindeki dizin.

Dönüş Değeri

Belirtilen nesne kilitliyse sıfır olmayan; aksi takdirde 0.

CMultiLock::Lock

Oluşturucuya sağlanan eşitleme nesneleri tarafından denetlenen bir veya daha fazla kaynağa erişim elde etmek için bu işlevi çağırın CMultiLock .

DWORD Lock(
    DWORD dwTimeOut = INFINITE,
    BOOL bWaitForAll = TRUE,
    DWORD dwWakeMask = 0);

Parametreler

dwTimeOut
Eşitleme nesnesinin kullanılabilir olmasını beklenecek süreyi belirtir (sinyal görüntülenir). SONSUZ ise, Lock geri dönmeden önce nesnenin işaretlenmesini bekler.

bWaitForAll
Döndürülmeden önce bekleyen tüm nesnelerin aynı anda işaretlenip işaretlenmediğini belirtir. YANLIŞ ise, Lock bekleyen nesnelerden herhangi biri işaretlendiğinde geri döner.

dwWakeMask
Beklemeyi durdurmasına izin verilen diğer koşulları belirtir. Bu parametre için kullanılabilir seçeneklerin tam listesi için bkz . Windows SDK'sında MsgWaitForMultipleObjects .

Dönüş Değeri

Başarısız Lock olursa, - 1 döndürür. Başarılı olursa, aşağıdaki değerlerden birini döndürür:

  • WAIT_OBJECT_0 ile WAIT_OBJECT_0 + arasında (nesne sayısı - 1)

    bWaitForAll TRUE ise, tüm nesnelere işaret edilir (kullanılabilir). bWaitForAll YANLIŞ ise, dönüş değeri - WAIT_OBJECT_0, nesnenin sinyalli (kullanılabilir) nesne dizisindeki dizindir.

  • WAIT_OBJECT_0 + (nesne sayısı)

    dwWakeMask içinde belirtilen bir olay, iş parçacığının giriş kuyruğunda kullanılabilir.

  • WAIT_ABANDONED_0 ile WAIT_ABANDONED_0 + arasında (nesne sayısı - 1)

    bWaitForAll TRUE ise, tüm nesneler işaretlenir ve nesnelerden en az biri terk edilmiş bir mutex nesnesidir. bWaitForAll YANLIŞ ise, dönüş değeri - WAIT_ABANDONED_0, beklemeyi karşılayan terk edilmiş mutex nesnesinin nesne dizisindeki dizindir.

  • WAIT_TIMEOUT

    dwTimeOut içinde belirtilen zaman aşımı aralığı, bekleme başarılı olmadan sona erdi.

Açıklamalar

bWaitForAll TRUE ise, Lock tüm eşitleme nesneleri aynı anda sinyal alır almaz başarıyla döndürülecektir. bWaitForAll YANLIŞ ise, Lock eşitleme nesnelerinden biri veya daha fazlası sinyal alır almaz geri döner.

Lock Hemen döndüremezse, döndürmeden önce dwTimeOut parametresinde belirtilen milisaniye sayısından fazla beklemez. dwTimeOut INFINITE ise, Lock bir nesneye erişim elde edilene veya dwWakeMask'te belirtilen bir koşul karşılanana kadar döndürülmeyecektir. Aksi takdirde, bir eşitleme nesnesi elde edebildiyse Lock , başarıyla döndürülecektir; aksi takdirde hata döndürür.

CMultiLock::Unlock

sahip olduğu CMultiLockeşitleme nesnesini serbest bırakır.

BOOL Unlock();

BOOL Unlock(
    LONG lCount,
    LPLONG lPrevCount = NULL);

Parametreler

lCount
Yayınlanması gereken başvuru sayısı. 0'dan büyük olmalıdır. Belirtilen miktar nesnenin sayısının üst sınırını aşmasına neden olacaksa, sayı değiştirilmez ve işlev YANLIŞ döndürür.

lPrevCount
Eşitleme nesnesinin önceki sayısını almak için bir değişkeni gösterir. NULL ise, önceki sayı döndürülür.

Dönüş Değeri

İşlev başarılı olursa sıfır olmayan; aksi takdirde 0.

Açıklamalar

Bu işlev'in yıkıcısı tarafından CMultiLockçağrılır.

İlk biçimi Unlock tarafından CMultiLockyönetilen eşitleme nesnesinin kilidini açmaya çalışır. İkinci biçimi, Unlock sahip CMultiLockolduğu nesnelerin kilidini CSemaphore açmaya çalışır. Herhangi bir kilitli CSemaphore nesneye sahip değilse CMultiLock işlev FALSE döndürür; aksi takdirde TRUE döndürür. lCount ve lpPrevCount, CSingleLock::Unlock parametreleriyle tam olarak aynıdır. İkinci biçimi Unlock çok kilitli durumlar için nadiren geçerlidir.

Ayrıca bkz.

Hiyerarşi Grafiği