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.
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ığı bir 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. Belirtilen bir süre boyunca geçerli bağlamı askıya almak için wait işlevini kullanın. Bağlamların ne zaman engelleneceği, engelinin kaldırılacağı ve duraklama yapacağı üzerinde daha fazla denetim sağlamanız gerektiğinde veya geçerli bağlamı fazla yüklemeye almak istediğinizde Context 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, wait işlevi mevcut bağlamı, milliseconds parametresi için sağlanan değerden daha uzun süre askıya alabilir.
milliseconds parametresi için 0 (sıfır) değeri geçirilmesi, çalışma zamanının geçerli bağlamı, diğer tüm etkin bağlamlara iş yapma fırsatı verilene kadar duraklatmasına neden olur. Bu, görevi diğer tüm etkin görevlere vermenizi sağlar.
Örnek
Geçerli bağlamı geçici olarak devretmek için wait işlevini kullanan ve dolayısıyla diğer bağlamların çalışmasına izin veren bir örnek için, Nasıl yapılır: Yürütme Sırasını Etkilemek için Zamanlama Gruplarını Kullanma başlıklı makaleye bkz.
Bağlam Sınıfı
concurrency::Context sınıfı, bir yürütme bağlamı için programlama soyutlaması sağlar ve iki önemli özellik sunar: geçerli bağlamı işbirliği içinde engelleme, engellemeyi kaldırma ve bağlamı verme olanağı ve geçerli bağlamı fazla aboneliğe izin verme olanağı.
kooperatif engelleme
Context sınıfı, mevcut yürütme bağlamını engellemenize veya devretmenize olanak tanır. Bir kaynak kullanılamadığından geçerli bağlam devam edemiyorsa bekletme veya izin verme yararlı olabilir.
Eşzamanlılık::Context::Block yöntemi geçerli bağlamı kilitler. Engellenen bir bağlam, çalışma zamanının diğer görevleri gerçekleştirebilmesi için işleme kaynaklarını serbest bırakır.
concurrency::Context::Unblock yöntemi engellenen bağlamın engellemesini kaldırır.
Context::Unblock yöntemi, Context::Block'yi çağıran bağlamdan farklı bir bağlamdan çağrılmalıdır. Çalışma zamanı, bir bağlam kendi engelini kaldırmaya çalışırsa concurrency::context_self_unblock hatasını atar.
Bir bağlamı işbirliğiyle engellemek ve engellemesini kaldırmak için genellikle concurrency::Context::CurrentContext çağrısını yaparak geçerli iş parçacığıyla ilişkili nesneye bir Context işaretçi alır ve sonucu kaydedersiniz. Ardından geçerli bağlamı engellemek için Context::Block yöntemini çağırırsınız. Daha sonra, engellenen bağlamın kilidini açmak için ayrı bir bağlamdan Context::Unblock çağrısı yapın.
Her çağrı çiftini Context::Block ve Context::Unblock ile eşleştirmeniz gerekir. Çalışma zamanı, concurrency::context_unblock_unbalanced hatasını, Context::Block veya Context::Unblock yöntemi ardışık olarak diğer yönteme karşılık gelen bir çağrı olmadan çağrıldığında fırlatır. Ancak, Context::Unblock'i çağırmadan önce Context::Block'i çağırmanız gerekmez. Örneğin, bir bağlam aynı bağlam için başka bir bağlam Context::Block'i çağırmadan önce Context::Unblock'i çağırırsa, o 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.
Context::Block yöntemini çağırdığınızda, çalışma zamanı bağlamı yeniden zamanlamaz.
Örnek
İşbirlikçi bir semafor sınıfını uygulamak için Context::Block, Context::Unblock ve Context::Yield yöntemlerini kullanan bir örnek için, Bağlam Sınıfını Kullanarak İşbirlikçi Semaforun Nasıl Uygulanacağı bölümüne bakın.
Aşırı Abonelik
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 thread dahil) tarafından oluşturulmamış bir thread'den çağrıldığında aşırı yüklenme hiçbir etkiye sahip değildir.
tr-TR: Geçerli bağlamda aşırı aboneliği etkinleştirmek için, _BeginOversubscription parametresi true olarak ayarlanmış halde concurrency::Context::Oversubscribe yöntemini çağırın. Eşzamanlılık Çalışma Zamanı tarafından oluşturulan bir iş parçacığında oversubscription'ı etkinleştirdiğinizde, bu, çalışma zamanının ek bir iş parçacığı oluşturmasına yol açar. Fazla abonelik gerektiren tüm görevler tamamlandıktan sonra, _BeginOversubscription parametresi false olarak ayarlanmış şekilde Context::Oversubscribe'ı çağırın.
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 görev aynı bağlama aitse, yalnızca en dıştaki Context::Oversubscribe çağrısı ek iş parçacığı oluşturulmasına neden olur.
Not
Çalışma zamanı, fazla abonelik etkinleştirilmeden önce devre dışı bırakılırsa concurrency::invalid_oversubscribe_operation fırlatır.
Örnek
Ağ bağlantısından veri okumanın neden olduğu gecikme süresini dengelemek için aşırı abonelik kullanımıyla ilgili bir örnek için bkz: Nasıl Yapılır: Gecikmeyi Dengelemek İçin Aşırı 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