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::Blockfarklı 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::Unblockile 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::Unblockgerekmez. Ö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::Blockbir ö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