CSemaphore Sınıfı
Sınıfın CSemaphore
nesnesi bir "semafor"u temsil eder; bir veya daha fazla işlemdeki sınırlı sayıda iş parçacığının belirtilen bir kaynağa erişen iş parçacığı sayısını korumasını sağlayan eşitleme nesnesidir.
Sözdizimi
class CSemaphore : public CSyncObject
Üyeler
Ortak Oluşturucular
Veri Akışı Adı | Açıklama |
---|---|
CSemaphore::CSemaphore | Bir CSemaphore nesne oluşturur. |
Açıklamalar
Semaforlar, yalnızca sınırlı sayıda kullanıcıyı destekleyebilecek paylaşılan bir kaynağa erişimi denetlemede yararlıdır. Nesnenin CSemaphore
geçerli sayısı, izin verilen ek kullanıcıların sayısıdır. Sayı sıfıra ulaştığında, nesne tarafından CSemaphore
denetlenen kaynağı kullanma girişimleri bir sistem kuyruğuna eklenir ve zaman aşımına uğradıklarında veya sayı 0'ın üzerine çıkana kadar bekler. Denetlenen kaynağa bir kerede erişebilecek en fazla kullanıcı sayısı, nesnenin CSemaphore
oluşturulması sırasında belirtilir.
Bir CSemaphore
nesneyi kullanmak için, gerektiğinde nesnesini oluşturun CSemaphore
. Beklemek istediğiniz semaforun adını ve uygulamanızın başlangıçta bu semafora sahip olması gerektiğini belirtin. Ardından oluşturucu döndürdüğünde semafora erişebilirsiniz. Denetlenen kaynağa erişiminiz bittiğinde CSyncObject::Unlock'ı çağırın.
Nesneleri kullanmanın CSemaphore
alternatif bir yöntemi, denetlemek istediğiniz sınıfa veri üyesi olarak türünde CSemaphore
bir değişken eklemektir. Denetimli nesnenin oluşturulması sırasında, ilk erişim sayısını, maksimum erişim sayısını, semaforun adını (işlem sınırları arasında kullanılacaksa) ve istenen güvenlik özniteliklerini belirten veri üyesinin oluşturucusunu CSemaphore
çağırın.
Nesneler tarafından CSemaphore
denetlenen kaynaklara bu şekilde erişmek için önce CSingleLock türünde bir değişken oluşturun veya kaynağınızın erişim üyesi işlevine CMultiLock yazın. Ardından kilit nesnesinin üye işlevini çağırın Lock
(örneğin, CSingleLock::Lock). Bu noktada, iş parçacığınız kaynağa erişim elde eder, kaynağın serbest bırakılıp erişim kazanmasını bekler veya kaynağın serbest bırakılıp zaman aşımına uğradı ve kaynağa erişim sağlanamaması için bekler. Her durumda kaynağınıza iş parçacığı açısından güvenli bir şekilde erişilmiştir. Kaynağı serbest bırakmak için, kilit nesnesinin Unlock
üye işlevini (örneğin, CSingleLock::Unlock) kullanın veya kilit nesnesinin kapsamın dışında bırakılmasına izin verin.
Alternatif olarak, tek başına bir CSemaphore
nesne oluşturabilir ve denetlenen kaynağa erişmeye çalışmadan önce nesneye açıkça erişebilirsiniz. Bu yöntem, kaynak kodunuzu okuyan biri için daha net olsa da hataya daha açıktır.
Nesneleri kullanma CSemaphore
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
CSemaphore
Gereksinimler
Üst bilgi: afxmt.h
CSemaphore::CSemaphore
Adlandırılmış veya adlandırılmamış CSemaphore
bir nesne oluşturur.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parametreler
lInitialCount
Semafor için ilk kullanım sayısı. 0'dan büyük veya buna eşit ve lMaxCount değerinden küçük veya buna eşit olmalıdır.
lMaxCount
Semafor için maksimum kullanım sayısı. 0'dan büyük olmalıdır.
pstrName
Semaforun adı. Semafora işlem sınırları boyunca erişilecekse sağlanmalıdır. ise NULL
, nesnenin adı kaldırılacaktır. Ad mevcut bir semaforla eşleşiyorsa, oluşturucu bu adın semaforunu başvuruda bulunan yeni CSemaphore
bir nesne oluşturur. Ad, semafor olmayan mevcut bir eşitleme nesnesiyle eşleşirse, yapı başarısız olur.
lpsaAttributes
Semafor nesnesi için güvenlik öznitelikleri. Bu yapının tam açıklaması için bkz . Windows SDK'sında SECURITY_ATTRIBUTES .
Açıklamalar
Bir CSemaphore
nesneye erişmek veya nesneyi serbest bırakmak için bir CMultiLock veya CSingleLock nesnesi oluşturun ve bu nesnenin Üyeyi Kilitle ve Kilidini Aç işlevlerini çağırabilirsiniz.
Önemli
Nesneyi oluşturduktan CSemaphore
sonra, mutex'in zaten mevcut olmadığından emin olmak için GetLastError kullanın. Mutex beklenmedik bir şekilde mevcutsa, sahte bir işlemin çömeldiğini ve mutex'i kötü amaçlı olarak kullanmayı amaçladığını gösterebilir. Bu durumda, önerilen güvenlik bilincine sahip yordam tanıtıcıyı kapatmak ve nesne oluşturulurken bir hata varmış gibi devam etmektir.