Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Çok iş parçacıklı bir apartman modelinde, serbest iş parçacığı olarak başlatılan işlemdeki tüm iş parçacıkları tek bir dairede bulunur. Bu nedenle, iş parçacıkları arasında sıralamaya gerek yoktur. COM bu modelde pencere iletilerini kullanmadığından iş parçacıklarının iletileri alması ve göndermesi gerekmez.
Çok iş parçacıklı dairedeki nesnelerin yöntemlerine yapılan çağrılar, apartmandaki herhangi bir iş parçacığında çalıştırılabilir. Çağrıların seri hale getirilmesi yoktur; birçok çağrı aynı yönteme veya aynı nesneye aynı anda oluşabilir. Çok iş parçacıklı dairede oluşturulan nesnelerin, yöntemlerindeki çağrıları diğer iş parçacıklarından istedikleri zaman işleyebilmesi gerekir.
Nesnelere yapılan çağrılar herhangi bir şekilde serileştirilmediğinden, çok iş parçacıklı nesne eşzamanlılığı en yüksek performansı sunar ve çoklu iş parçacığı, çapraz işlem ve makineler arası çağrı için çok işlemcili donanımdan en iyi şekilde yararlanır. Ancak bu, nesnelerin kodunun genellikle bu bölümün ilerleyen bölümlerinde açıklanan olay nesneleri, kritik bölümler, mutex'ler veya semaforlar gibi eşitleme temel öğelerini kullanarak arabirim uygulamalarında eşitleme sağlaması gerektiği anlamına gelir. Buna ek olarak, nesne erişen iş parçacıklarının ömrünü denetlemediğinden, nesnede iş parçacığına özgü durum depolanamaz (iş parçacığı yerel depolamada).
Çok iş parçacıklı daireler için eşitlemeyle ilgili bazı önemli noktalar aşağıdadır:
- COM, yalnızca tek iş parçacıklı daireler için çağrı eşitlemesi sağlar.
- Çok iş parçacıklı daireler arama yaparken arama almaz (aynı yazışmada).
- Çok iş parçacıklı daireler girişle eşitlenmiş çağrı yapamaz.
- Zaman uyumsuz çağrılar, çok iş parçacıklı dairelerde zaman uyumlu çağrılara dönüştürülür.
- İleti filtresi, çok iş parçacıklı bir dairede herhangi bir iş parçacığı için çağrılmaz.
Bir iş parçacığını serbest iş parçacığı olarak başlatmak için CoInitializeExçağrısı yapın ve COINIT_MULTITHREADED belirtin. İşlem içi sunucu iş parçacığı oluşturma hakkında bilgi için bkz. In-Process Sunucu İş Parçacığı Oluşturma Sorunları.
Birden çok istemci, serbest iş parçacığını destekleyen bir nesne olan farklı iş parçacıklarından aynı anda çağrı yapabilir. İşlem dışı serbest sunucularda, COM, RPC alt sistemi aracılığıyla sunucu işleminde bir iş parçacığı havuzu oluşturur ve bu iş parçacıklarından herhangi biri tarafından herhangi bir istemci çağrısı (veya birden çok istemci çağrısı) herhangi bir zamanda teslim edilebilir. İşlem dışı bir sunucunun da sınıf fabrikasında eşitleme uygulaması gerekir. Serbest iş parçacıklı, işlem içi nesneler istemcinin birden çok iş parçacığından doğrudan çağrı alabilir.
İstemci birden çok iş parçacığında COM işi yapabilir. Tüm iş parçacıkları aynı çok iş parçacıklı daireye aittir. Arabirim işaretçileri, çok iş parçacıklı bir daire içinde doğrudan iş parçacığından iş parçacığına geçirilir, bu nedenle arabirim işaretçileri iş parçacıkları arasında sıralanmaz. İleti filtreleri (IMessageFilteruygulamaları) çok iş parçacıklı dairelerde kullanılmaz. İstemci iş parçacığı, daire dışı nesnelere com çağrısı yaptığında askıya alır ve çağrı döndürdüğünde devam eder. İşlemler arasındaki çağrılar rpc tarafından işlenmeye devam eder.
Serbest iş parçacıklı modelle başlatılan iş parçacıklarının kendi eşitlemelerini uygulaması gerekir. Bu bölümde daha önce belirtildiği gibi, Windows bu uygulamayı aşağıdaki eşitleme temel bilgileri aracılığıyla etkinleştirir:
- Olay nesneleri, bir olayın oluştuğuna ilişkin bir veya daha fazla iş parçacığına sinyal vermenin bir yolunu sağlar. bir işlem içindeki herhangi bir iş parçacığı bir olay nesnesi oluşturabilir. Olay işleyicisi, createEventolay oluşturma işlevi tarafından döndürülür. Bir olay nesnesi oluşturulduktan sonra, nesnenin tanıtıcısına sahip iş parçacıkları yürütmeye devam etmeden önce üzerinde bekleyebilir.
- Kritik bölümler, yürütülmeden önce bazı paylaşılan veri kümesine özel erişim gerektiren ve yalnızca tek bir işlem içindeki iş parçacıkları tarafından kullanılan bir kod bölümü için kullanılır. Kritik bölüm, aynı anda yalnızca bir iş parçacığının geçebileceği bir turnike gibidir ve aşağıdaki gibi çalışır:
- Bir kerede birden fazla iş parçacığının paylaşılan verilere erişmediğinden emin olmak için, işlemin birincil iş parçacığı genel bir CRITICAL_SECTION veri yapısı ayırır ve üyelerini başlatır. Kritik bir bölüme giren bir iş parçacığı, EnterCriticalSection işlevini çağırır ve veri yapısının üyelerini değiştirir.
- Kritik bir bölüm girmeye çalışan bir iş parçacığı, CRITICAL_SECTION veri yapısının değiştirilip değiştirilmediğini denetleyen EnterCriticalSectionçağırır. Öyleyse, başka bir iş parçacığı şu anda kritik bölümdedir ve sonraki iş parçacığı uyku moduna geçirilir. Kritik bir bölümden çıkan bir iş parçacığı, veri yapısını sıfırlayan LeaveCriticalSectionçağırır. Bir iş parçacığı kritik bir bölümden ayrıldığında, sistem uyku iş parçacıklarından birini uyandırır ve kritik bölüme girer.
- Mutexes, mutex'in farklı işlemlerde çalışan iş parçacıkları tarafından erişilebilir olması dışında kritik bir bölümle aynı işlevi gerçekleştirir. Bir mutex nesnesine sahip olmak, zemini tartışma konusu yapmak gibidir. İşlem, tanıtıcı döndüren CreateMutex işlevini çağırarak bir mutex nesnesi oluşturur. Bir mutex nesnesi isteyen ilk iş parçacığı, nesnenin sahipliğini alır. İş parçacığının mutex ile işi bittiğinde, sahiplik ilk gelen ilk hizmet temelinde diğer iş parçacıklarına geçer.
- Semaforlar, kullanılabilir bazı kaynaklarda başvuru sayısını korumak için kullanılır. İş parçacığı, CreateSemaphore işlevini çağırarak ve kaynağa bir işaretçi, ilk kaynak sayısı ve en yüksek kaynak sayısı geçirerek kaynak için bir semafor oluşturur. Bu işlev bir tanıtıcı döndürür. Kaynak isteyen bir iş parçacığı, WaitForSingleObject işlevine yapılan çağrıda semafor tutamacını geçirir. Semafor nesnesi kaynağı yoklar ve kullanılabilir olup olmadığını belirler. Bu durumda semafor kaynak sayısını azalarak bekleyen iş parçacığını uyandırır. Sayı sıfırsa, başka bir iş parçacığı bir kaynağı serbest bırakana kadar iş parçacığı uykuda kalır ve bu da semaforunun sayıyı bire artırmasına neden olur.
İlgili konular