Semafor Nesneleri
semafor nesnesi, sıfır ile belirtilen en yüksek değer arasında sayım tutan bir eşitleme nesnesidir. Bir iş parçacığı semafor nesnesini her beklediğinde sayı azalmış ve bir iş parçacığı semaforu her serbest bıraktığında artırılır. Sayı sıfıra ulaştığında, artık hiçbir iş parçacığı semafor nesne durumunun işaretlenmesini başarıyla bekleyemez. Bir semaforun durumu, sayısı sıfırdan büyük olduğunda işaretlenmeyen ve sayısı sıfır olduğunda işaretsiz olarak ayarlanır.
Semafor nesnesi, sınırlı sayıda kullanıcıyı destekleyebilecek paylaşılan bir kaynağı denetlemede kullanışlıdır. Kaynağı paylaşan iş parçacığı sayısını belirtilen en yüksek sayıyla sınırlayan bir kapı işlevi görür. Örneğin, bir uygulama oluşturduğu pencere sayısına bir sınır yerleştirebilir. Pencere sınırına eşit en yüksek sayıya sahip bir semafor kullanır, bir pencere oluşturulduğunda sayıyı azaltma ve bir pencere kapalı olduğunda artırma. Uygulama, her pencere oluşturulmadan önce bekleme işlevlerinden birine çağrıda semafor nesnesini belirtir. Sayı sıfır olduğunda (pencere sınırına ulaşıldığını gösterir), bekleme işlevi pencere oluşturma kodunun yürütülmesini engeller.
İş parçacığı, semafor nesnesi oluşturmak için CreateSemaphoreveya CreateSemaphoreExişlevinikullanır. Oluşturma iş parçacığı, nesnenin ilk sayısını ve sayının en yüksek değerini belirtir. İlk sayı sıfırdan küçük veya en büyük değerden büyük olmamalıdır. Oluşturma iş parçacığı semafor nesnesi için bir ad da belirtebilir. Diğer işlemlerdeki iş parçacıkları, OpenSemaphore işlevine yapılan çağrıda adını belirterek var olan bir semafor nesnesinin tanıtıcısını açabilir. Mutex, olay, semafor ve zamanlayıcı nesnelerinin adları hakkında ek bilgi için bkz. İşlemler Arası Eşitleme.
Semaforda birden fazla iş parçacığı bekliyorsa, bekleyen bir iş parçacığı seçilir. İlk gelen ilk çıkar (FIFO) siparişi varsaymayın. Çekirdek modu APC'leri gibi dış olaylar bekleme sırasını değiştirebilir.
bir semaforun durumu işaretlendi olarak ayarlandığından bekleme işlevlerinden biri her döndürdüğünde, semafor sayısı bir azalır. ReleaseSemaphore işlevi, semafor sayısını belirtilen miktarda artırır. Sayı hiçbir zaman sıfırdan küçük veya maksimum değerden büyük olamaz.
Semaforun ilk sayısı genellikle en yüksek değere ayarlanır. Korumalı kaynak tüketildikçe sayı bu düzeyden azalmış olur. Alternatif olarak, uygulama başlatılırken korumalı kaynağa erişimi engellemek için ilk sayısı sıfır olan bir semafor oluşturabilirsiniz. Başlatmadan sonra, sayıyı en yüksek değere artırmak için ReleaseSemaphore kullanabilirsiniz.
Bir mutex nesnesine sahip olan bir iş parçacığı, aynı mutex nesnesinin yürütülmesi engellenmeden işaretlenmesini art arda bekleyebilir. Ancak, aynı semafor nesnesi için art arda bekleyen bir iş parçacığı, bir bekleme işlemi her tamamlandığında semafor sayısını azalan; iş parçacığı, sayı sıfıra ulaştığında engellenir. Benzer şekilde, yalnızca bir mutex'in sahibi olan iş parçacığı ReleaseMutex işlevini başarıyla çağırabilir, ancak herhangi bir iş parçacığı bir semafor nesnesinin sayısını artırmak için ReleaseSemaphore kullanabilir.
İş parçacığı, bekleme işlevlerinden herhangi birine yapılan çağrılarda aynı semafor nesnesini tekrar tekrar belirterek bir semaforun sayısını birden çok kez geri alabilir. Ancak, aynı semaforun birden çok tutamacını içeren bir dizi ile birden çok nesneli bekleme işlevlerinden birinin çağrılması birden çok azalmaya neden olmaz.
Semafor nesnesini kullanmayı bitirdiğinizde, tanıtıcıyı kapatmak için CloseHandle işlevini çağırın. Semafor nesnesi, son tutamacı kapatıldığında yok edilir. Tanıtıcının kapatılması semafor sayısını etkilemez; bu nedenle, tanıtıcıyı kapatmadan önce veya işlem sonlandırılmadan önce ReleaseSemaphore çağırın. Aksi takdirde, beklemedeki bekleme işlemleri zaman aşımına uğradı veya zaman aşımı değerinin belirtilip belirtilmediğine bağlı olarak süresiz olarak devam eder.
İlgili konular
-
Semafor Nesneleri Kullanarak