Bağlamlar
Bu belgede Eşzamanlılık Çalışma Zamanı'ndaki bağlamların rolü açıklanmaktadır. Zamanlayıcıya bağlı bir iş parçacığı yürütme bağlamı veya yalnızca bağlam olarak bilinir. Concurrency::wait işlevi ve concurrency::Context sınıfı, bağlamların davranışını denetlemenizi sağlar. Geçerli bağlamı wait
belirtilen bir süre boyunca askıya almak için işlevini kullanın. Bağlamların Context
ne zaman engellendiğinde, engelini kaldırıldığında ve veriminde daha fazla denetime ihtiyacınız olduğunda veya geçerli bağlamın fazla aboneliğini almak istediğinizde sınıfını kullanın.
İpucu
Eşzamanlılık Çalışma Zamanı varsayılan bir zamanlayıcı sağlar ve bu nedenle uygulamanızda bir zamanlayıcı oluşturmanız gerekmez. Görev Zamanlayıcı, uygulamalarınızın performansında ince ayarlamalar yapmanızı sağladığından Eşzamanlılık Çalışma Zamanı'nı kullanmaya yeni başladıysanız Paralel Desenler Kitaplığı (PPL) veya Zaman Uyumsuz Aracılar Kitaplığı ile başlamanızı öneririz.
wait İşlevi
concurrency::wait işlevi, belirtilen sayıda milisaniye için geçerli bağlamın yürütülmesini birlikte verir. Çalışma zamanı, diğer görevleri gerçekleştirmek için verim süresini kullanır. Belirtilen süre geçtikten sonra çalışma zamanı yürütme bağlamını yeniden zamanlar. Bu nedenle işlev, wait
geçerli bağlamı parametresi için milliseconds
sağlanan değerden daha uzun süre askıya alabilir.
parametresi için 0 (sıfır) değerinin milliseconds
geçirilmesi, çalışma zamanının diğer tüm etkin bağlamlara iş gerçekleştirme fırsatı verilene kadar geçerli bağlamı askıya almasına neden olur. Bu, görevi diğer tüm etkin görevlere vermenizi sağlar.
Örnek
geçerli bağlamı wait
vermek için işlevini kullanan ve dolayısıyla diğer bağlamların çalışmasına izin veren bir örnek için bkz . Nasıl yapılır: Yürütme Sırasını Etkilemek için Zamanlama Gruplarını Kullanma.
Bağlam Sınıfı
concurrency::Context sınıfı , yürütme bağlamı için bir programlama soyutlaması sağlar ve iki önemli özellik sunar: geçerli bağlamı işbirliğiyle engelleme, engellemeyi kaldırma ve verme ve geçerli bağlamı fazla abonelikten kaldırma olanağı.
kooperatif engelleme
sınıfı, Context
geçerli yürütme bağlamını engellemenize veya vermenizi sağlar. Bir kaynak kullanılamadığından geçerli bağlam devam edemiyorsa engelleme veya verim yararlı olabilir.
Eşzamanlılık::Context::Block yöntemi geçerli bağlamı engeller. Engellenen bir bağlam, çalışma zamanının diğer görevleri gerçekleştirebilmesi için işleme kaynaklarını verir. concurrency::Context::Unblock yöntemi engellenen bağlamın engellemesini kaldırır. Context::Unblock
yöntemi, olarak adlandırılandan Context::Block
farklı bir bağlamdan çağrılmalıdır. Bir bağlam engelini kaldırmaya çalışırsa çalışma zamanı eşzamanlılık::context_self_unblock oluşturur.
Bir bağlamı işbirliğiyle engellemek ve engellemesini kaldırmak için genellikle eşzamanlılık::Context::CurrentContext çağrısı yapıp geçerli iş parçacığıyla ilişkili nesneye Context
bir işaretçi alır ve sonucu kaydedersiniz. Ardından geçerli bağlamı Context::Block
engellemek için yöntemini çağırırsınız. Daha sonra, engellenen bağlamın engelini kaldırmak için ayrı bir bağlamdan çağrısında Context::Unblock
bulunur.
her çağrı çiftini ve Context::Unblock
ile Context::Block
eşleştirmeniz gerekir. Çalışma zamanı, veya Context::Unblock
yöntemi diğer yöntemle eşleşen bir çağrı olmadan ardışık olarak çağrıldığında Context::Block
eşzamanlılık::context_unblock_unbalanced oluşturur. Ancak, çağırmadan önce aramanız Context::Block
Context::Unblock
gerekmez. Örneğin, bir bağlam başka bir bağlamdan önce çağrılar Context::Unblock
aynı bağlamı çağırırsa Context::Block
, bu bağlam engellenmemiş olarak kalır.
Eşzamanlılık::Context::Yield yöntemi, çalışma zamanının diğer görevleri gerçekleştirebilmesi ve yürütme bağlamını yeniden zamanlayabilmesi için yürütmeyi verir. yöntemini çağırdığınızda Context::Block
çalışma zamanı bağlamı yeniden zamanlamaz.
Örnek
İşbirlikçi semafor sınıfı uygulamak için , ve yöntemlerini kullanan Context::Block
bir örnek için bkz. Nasıl yapılır: İşbirlikçi Semafor Uygulamak için Bağlam Sınıfını Context::Yield
Kullanma. Context::Unblock
Oversubscription
Varsayılan zamanlayıcı, kullanılabilir donanım iş parçacıklarıyla aynı sayıda iş parçacığı oluşturur. Belirli bir donanım iş parçacığı için ek iş parçacıkları oluşturmak için oversubscription kullanabilirsiniz.
Hesaplama açısından yoğun işlemler için, fazla abonelik genellikle ek ek yük sağladığından ölçeklendirilmez. Ancak, yüksek gecikme süresine sahip görevler için (örneğin, diskten veya ağ bağlantısından veri okuma) aşırı abonelik bazı uygulamaların genel verimliliğini artırabilir.
Not
Fazla aboneliği yalnızca Eşzamanlılık Çalışma Zamanı tarafından oluşturulan bir iş parçacığından etkinleştirin. Çalışma zamanı (ana iş parçacığı dahil) tarafından oluşturulmamış bir iş parçacığından çağrıldığında aşırı abonelik hiçbir etkiye sahip değildir.
Geçerli bağlamda fazla aboneliği etkinleştirmek için, parametresi olarak ayarlanmış eşzamanlılık::Context::Oversubscribe yöntemini çağırın_BeginOversubscription
.true
Eşzamanlılık Çalışma Zamanı tarafından oluşturulan bir iş parçacığında oversubscription'ı etkinleştirdiğinizde, çalışma zamanının bir ek iş parçacığı oluşturmasına neden olur. Fazla abonelik gerektiren tüm görevler tamamlandıktan sonra parametresi olarak ayarlanmış olarak çağrısı Context::Oversubscribe
_BeginOversubscription
yapın false
.
Geçerli bağlamdan fazla aboneliği birden çok kez etkinleştirebilirsiniz, ancak etkinleştirdiğiniz sayıda devre dışı bırakmanız gerekir. Fazla abonelik de iç içe geçirilebilir; başka bir ifadeyle, aşırı abonelik kullanan başka bir görev tarafından oluşturulan bir görev de bağlamı fazla abonelik yapabilir. Ancak hem iç içe görev hem de üst öğesi aynı bağlama aitse, yalnızca en dıştaki çağrısı Context::Oversubscribe
ek iş parçacığı oluşturulmasına neden olur.
Not
Çalışma zamanı, etkinleştirilmeden önce fazla abonelik devre dışı bırakılırsa eşzamanlılık::invalid_oversubscribe_operation oluşturur.
Örnek
Ağ bağlantısından veri okumanın neden olduğu gecikme süresini dengelemek için oversubscription kullanan bir örnek için bkz . Nasıl yapılır: Gecikmeyi Dengelemek için Fazla Abonelik Kullanma.
Ayrıca bkz.
Görev Zamanlayıcı
Nasıl yapılır: Yürütme Sırasını Etkilemek için Zamanlama Grupları Kullanma
Nasıl yapılır: Bağlam Sınıfını İşbirlikçi Semafor Uygulamak için Kullanma
Nasıl yapılır: Gecikmeyi Dengelemek için Aşırı Aboneliği Kullanma