C++ Eşyordam Örnekleri

C Esyordam Ornekleri



Eşyordamlar, eşzamansız kodu daha organize ve doğrusal bir şekilde yazmanıza olanak tanıyan, yapısal ve sıralı bir yaklaşımı teşvik eden bir dil özelliği sağlar. Belirli durumlarda, tüm iş parçacığını durdurmadan bir işlevin yürütülmesini duraklatmak ve yeniden başlatmak için bir mekanizma sağlarlar. Eşyordamlar, bir dosyadan okuma veya ağ çağrısı gönderme gibi G/Ç işlemlerini beklemeyi gerektiren görevleri yerine getirirken faydalıdır.

Eşyordamlar, bir fonksiyonun değer üretebildiği ve daha sonra yürütmeye devam etmek için devam ettirildiği jeneratörler konseptine dayanmaktadır. Eşyordamlar, eşzamansız işlemleri yönetmek için güçlü bir araç sağlar ve kodunuzun genel kalitesini büyük ölçüde artırabilir.

Coroutine'lerin Kullanım Alanları

Modern programlamada, özellikle C++ gibi dillerde, çeşitli nedenlerden dolayı eşyordamlara ihtiyaç duyulur. İşte koroutinlerin faydalı olmasının bazı önemli nedenleri:







Eşyordamlar eşzamansız programlamaya zarif bir çözüm sunar. Mantık yürütmesi ve kavraması daha kolay, sıralı ve bloke edici görünen bir kod oluşturmayı mümkün kılarlar. Eşyordamlar, iş parçacıklarını engellemeden belirli noktalarda yürütmelerini askıya alabilir ve diğer görevlerin paralel çalışmasına olanak tanır. Bu sayede, I/O işlemlerini içeren veya harici olayların beklendiği uygulamalarda sistem kaynakları daha etkin kullanılabilir ve yanıt verme hızı arttırılabilir.



Kodun anlaşılmasını ve bakımını kolaylaştırabilirler. Karmaşık geri çağırma zincirlerini veya durum makinelerini ortadan kaldıran eşyordamlar, kodun daha doğrusal ve sıralı bir tarzda yazılmasını sağlar. Bu, kod organizasyonunu iyileştirir, iç içe geçmeyi azaltır ve mantığın anlaşılmasını kolaylaştırır.



Eşyordamlar eşzamanlılık ve paralelliği ele almak için yapılandırılmış bir yol sağlar. Daha sezgisel bir sözdizimi kullanarak karmaşık koordinasyon modellerini ve eşzamansız iş akışlarını ifade etmenize olanak tanırlar. İş parçacıklarının engellenebileceği geleneksel iş parçacığı modellerinden farklı olarak eşyordamlar, sistem kaynaklarını serbest bırakabilir ve verimli bir çoklu görevi etkinleştirebilir.





C++'ta eşyordamların uygulanmasını göstermek için bazı örnekler oluşturalım.

Örnek 1: Temel Eşyordamlar

Temel eşyordam örneği aşağıda verilmiştir:



#include

#include

yapı BuCorout {

yapı söz_türü {

ThisCorout get_return_object ( ) { geri dönmek { } ; }

std :: askıya_asla ilk_askıya alma ( ) { geri dönmek { } ; }

std :: askıya_asla final_suspend ( ) hayır hariç { geri dönmek { } ; }

geçersiz işlenmeyen özel durum ( ) { }

geçersiz return_void ( ) { }

} ;

bool wait_ready ( ) { geri dönmek YANLIŞ ; }

geçersiz wait_suspend ( std :: coroutine_handle <> H ) { }

geçersiz wait_resume ( ) { std :: cout << 'Coroutine yeniden başlatıldı.' << std :: sonunda ; }

} ;

BuCorout foo ( ) {

std :: cout << 'Coroutine başladı.' << std :: sonunda ;

co_await std :: askıya_always { } ;

ortak dönüş ;

}

int ana ( ) {

Oto cr = foo ( ) ;

std :: cout << 'Coroutine yaratıldı.' << std :: sonunda ;

cr. wait_resume ( ) ;

std :: cout << 'Koroutin bitti.' << std :: sonunda ;

geri dönmek 0 ;

}

Daha önce verdiğimiz kodu inceleyelim ve ayrıntılı olarak açıklayalım:

Gerekli başlık dosyalarını ekledikten sonra bir eşyordamı temsil eden “ThisCorout” yapısını tanımlıyoruz. 'ThisCorout'un içinde eşyordam vaadini işleyen 'promise_type' adlı başka bir yapı tanımlanır. Bu yapı eşyordam makinelerinin ihtiyaç duyduğu çeşitli işlevleri sağlar.

Parantezlerin içinde get_return_object() fonksiyonunu kullanıyoruz. Eşyordam nesnesinin kendisini döndürür. Bu örnekte boş bir “ThisCorout” nesnesi döndürür. Daha sonra, eşyordamın ilk başlatıldığı andaki davranışı belirleyen startup_suspend() işlevi çağrılır. std::suspend_never eşyordamın başlangıçta askıya alınmaması gerektiği anlamına gelir.

Bundan sonra, eşyordamın bitmek üzere olduğu andaki davranışı belirleyen final_suspend() fonksiyonuna sahibiz. std::suspend_never, eşyordamın sonlandırılmadan önce askıya alınmaması gerektiği anlamına gelir.

Bir eşyordam bir istisna atarsa ​​unhandled_ Exception() yöntemi çağrılır. Bu örnekte bu boş bir işlevdir ancak istisnaları gerektiği gibi halledebilirsiniz. Eşyordam bir değer vermeden sona erdiğinde, return_void() yöntemi çağrılır. Bu durumda aynı zamanda boş bir fonksiyondur.

Ayrıca “ThisCorout” içerisinde üç üye fonksiyon tanımlıyoruz. Wait_ready() işlevi, eşyordamın yürütmeyi sürdürmeye hazır olup olmadığını kontrol etmek için çağrılır. Bu örnekte her zaman false değerini döndürür, bu da eşyordamın hemen devam etmeye hazır olmadığını gösterir. Eşyordam askıya alınacaksa, wait_suspend() yöntemi çağrılır. Burada boş bir fonksiyon var, yani askıya almanın gerekli olmadığı anlamına geliyor. Program, eşyordam askıya alındıktan sonra devam ettirildiğinde wait_resume() işlevini çağırır. Sadece eşyordamın devam ettirildiğini belirten bir mesaj verir.

Kodun sonraki satırları foo() coroutine fonksiyonunu tanımlar. Foo()'nun içinde eşyordamın başladığını belirten bir mesaj yazdırarak başlıyoruz. Daha sonra co_await std::suspend_always{} eşyordamı askıya almak için kullanılır ve daha sonraki bir noktada devam ettirilebileceğini belirtir. co_return ifadesi eşyordamı herhangi bir değer döndürmeden bitirmek için kullanılır.

Main() işlevinde foo() öğesini çağırarak “ThisCorout” türünde bir “cr” nesnesi oluştururuz. Bu, eşyordamı oluşturur ve başlatır. Daha sonra koroutinin oluşturulduğunu belirten bir mesaj yazdırılır. Daha sonra, yürütülmesine devam etmek için 'cr' eşyordam nesnesi üzerinde wait_resume() işlevini çağırıyoruz. Await_resume()'un içinde 'Koroutine devam ettirildi' mesajı yazdırılır. Son olarak, program sonlandırılmadan önce eşyordamın tamamlandığını belirten bir mesaj görüntüleriz.

Bu programı çalıştırdığınızda çıktısı aşağıdaki gibidir:

Örnek 2: Parametreler ve Verim ile Eşyordam

Şimdi, bu örnek için, bir sayı dizisi üretmek üzere üreteç benzeri bir davranış oluşturmak için C++'ta parametrelerle eşyordamların kullanımını ve verimi gösteren bir kod sağlıyoruz.

#include

#include

#include

yapı YENİKoroutin {

yapı p_type {

std :: vektör < int > değerler ;

YENİKoroutine get_return_object ( ) { geri dönmek { } ; }

std :: askıya_always ilk_askıya alma ( ) { geri dönmek { } ; }

std :: askıya_always final_suspend ( ) hayır hariç { geri dönmek { } ; }

geçersiz işlenmeyen özel durum ( ) { }

geçersiz return_void ( ) { }

std :: askıya_always Verim değeri ( int değer ) {

değerler. Geri itmek ( değer ) ;

geri dönmek { } ;

}

} ;

std :: vektör < int > değerler ;

yapı yineleyici {

std :: coroutine_handle <> chorus_handle ;

bool operatörü != ( yapı yineleyici & diğer ) yapı { geri dönmek chorus_handle != diğer. chorus_handle ; }

yineleyici & Şebeke ++ ( ) { chorus_handle. sürdürmek ( ) ; geri dönmek * Bu ; }

int Şebeke * ( ) yapı { geri dönmek chorus_handle. söz ( ) . değerler [ 0 ] ; }

} ;

yineleyici başlangıcı ( ) { geri dönmek yineleyici { std :: coroutine_handle < p_type >:: from_promise ( söz ( ) ) } ; }

yineleyici sonu ( ) { geri dönmek yineleyici { nullptr } ; }

std :: coroutine_handle < p_type > söz ( ) { geri dönmek
std :: coroutine_handle < p_type >:: from_promise ( * Bu ) ; }

} ;

YENİCoroutine Numaraları Oluştur ( ) {

ortak verim 5 ;

ortak verim 6 ;

ortak verim 7 ;

}

int ana ( ) {

YENİKoroutine nc = Numaraları oluşturmak ( ) ;

için ( int değer : nc ) {

std :: cout << değer << ' ' ;

}

std :: cout << std :: sonunda ;

geri dönmek 0 ;

}

Önceki kodda, NEWCoroutine yapısı eşyordam tabanlı bir oluşturucuyu temsil eder. Eşyordam için söz türü olarak hizmet veren iç içe geçmiş bir 'p_type' yapısı içerir. p_type yapısı, get_return_object(), startup_suspend(), final_suspend(), unhandled_ Exception() ve return_void() gibi eşyordam makinelerinin gerektirdiği işlevleri tanımlar. p_type yapısı aynı zamanda eşyordamdan değerleri elde etmek için kullanılan verim_değeri(int değeri) fonksiyonunu da içerir. Sağlanan değeri değerler vektörüne ekler.

NEWCoroutine yapısı, oluşturulan değerleri temsil eden 'values' adı verilen std::vector üye değişkenini içerir. NEWCoroutine'in içinde, oluşturulan değerlerin yinelenmesine izin veren iç içe geçmiş bir yapı yineleyicisi vardır. Eşyordamın tanıtıcısı olan ve yineleme için !=, ++ ve * gibi operatörleri tanımlayan bir coro_handle'a sahiptir.

p_type vaadinden coro_handle'ı alarak eşyordamın başlangıcında bir yineleyici oluşturmak için begin() işlevini kullanırız. Oysa end() işlevi, eşyordamın sonunu temsil eden ve bir nullptr coro_handle ile oluşturulan bir yineleyici oluşturur. Bundan sonra, p_type vaadinden bir coroutine_handle yaratarak söz tipini döndürmek için Promise() fonksiyonu kullanılır. createdNumbers() işlevi, co_yield anahtar sözcüğünü kullanarak üç değer (5, 6 ve 7) veren bir eşyordamdır.

Main() işlevinde, createdNumbers() ortakyordamı çağrılarak 'nc' adlı bir NEWCoroutine örneği oluşturulur. Bu, eşyordamı başlatır ve durumunu yakalar. “nc” değerleri üzerinde yineleme yapmak için aralık tabanlı bir “for” döngüsü kullanılır ve std::cout kullanılarak bir boşlukla ayrılan her değer yazdırılır.

Oluşturulan çıktı aşağıdaki gibidir:

Çözüm

Bu makale C++'da eşyordamların kullanımını göstermektedir. İki örneği tartıştık. İlk örnekte, temel eşyordam, bir C++ programında eşyordam fonksiyonları kullanılarak oluşturulur. İkinci gösterim ise eşyordamların parametrelerle birlikte kullanılması ve bir sayı dizisi oluşturmak için üreteç benzeri bir davranış oluşturmanın sağlanması yoluyla gerçekleştirildi.