C ++ Programlama Dili: CSTD :: Yürütme: Asenkron algoritmalar
Genel fikre göre std::execution Önceki blog yazımda kendimi özelleştirilebilir asenkron algoritmalara adadım.
P2300R10 teklifini sunmak kolay değildir. Her şeyden önce, güçlü ve ikincisi çok uzun. Bu nedenle, bazı yönlere odaklanıyorum.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
C ++ modeli için öncelikler
Teklif için çok sayıda öncelik geçerlidir. Asenkron kod için C ++ modeli
A Yürütme kaynağı Bir dizi yürütme aracısını yöneten programın bir kaynak birimidir. Yürütme kaynaklarına örnekler aktif iş parçacığı, bir iş parçacığı havuzu veya ek bir donanım hızlandırıcısıdır.
Her işlev çağrısı bir İnfaz acentesi gerçekleştirildi.
A Zamanlayıcı Bu kaynak üzerinde çalışma planlaması için tek tip ve jenerik bir arayüze sahip bir yürütme kaynağının soyutlamasıdır. Gönderen için bir fabrika.
Selam Dünya
İşte “Merhaba Dünya” programı std::execution. Bu kez program derleyicinin kaşifinde gerçekleştirilebilir ve analizim daha derine inecektir.
// HelloWorldExecution.cpp
#include <exec/static_thread_pool.hpp>
#include <iostream>
#include <stdexec/execution.hpp>
int main() {
exec::static_thread_pool pool(8);
auto sch = pool.get_scheduler();
auto begin = stdexec::schedule(sch);
auto hi = stdexec::then(begin, [] {
std::cout << "Hello world! Have an int.n";
return 13;
});
auto add_42 = stdexec::then(hi, [](int arg) { return arg + 42; });
auto = stdexec::sync_wait(add_42).value();
std::cout << "i = " << i << 'n';
}
Her şeyden önce, program baskısı:
Program, istenen kurulumun entegrasyonu ile başlar:exec/static_thread_pool.hpp> Bir iplik havuzunun oluşturulması için estdexec/execution.hpp> Yürütme ile ilgili yardımcı programlar için.
İçinde main İşlev bir static_thread_pool pool Sekiz iş parçacığı ile oluşturuldu.
Üye işlevi get_scheduler İplik havuzu, yürütme kaynakları programı için hafif bir ticarete çağrılır. sch İplik havuzundaki yayıncıları planlamak için kullanılacak. Bu durumda, yürütme kaynağı bir iş parçacığı havuzudur, ancak ana iş parçacığı, GPU veya bir faaliyet çerçevesi de olabilir
Bu nedenle program, yürütme aracıları tarafından gerçekleştirilen bir dizi vericiyi oluşturur.
İlk Verici begin İşlevle stdexec::schedule Belirtilen zamanlayıcıda bir vericinin sch Bitki. stdexec::schedule Bu sözde vericiler fabrikasıdır. Başka kanallar var. Bir sonraki standardın adlarının adını kullanıyorum:
Bir sonraki istasyon hi Verici adaptörünü kullanın stdexec::thenVerici begin Ve bir lambda işlevi kullandı. Bu lambda işlevi verir “Hello world! Have an int.. “Konsola ve tüm değeri ver 13 Geriye doğru. Üçüncü Verici add_42 aynı zamanda verici adaptörü ile de stdexec::then oluşturuldu. Devam filmi kontrolünü ele alıyor hi Görev ve başka bir lambda arg kabul eder ve eklenmesinin sonucu 42 geri gelmek. Mcitchi asenkron yapılır ve genellikle bestelenir.
std::execution Daha fazla vericilik adaptörleri sunar:
execution::continues_on
execution::then
execution::upon_*
execution::let_*
execution::starts_on
execution::into_variant
execution::stopped_as_optional
execution::stopped_as_error
execution::bulk
execution::split
execution::when_all
Vericilerin aksine, verici tüketicisi eşzamanlı olarak gerçekleştirilir. . stdexec::sync_wait-Çağrı tamamlanmasını bekliyor add_42-Mitnts. . value-Method sonucu için sync_wait değişken içinde olan verici tarafından üretilen değeri elde etmek için hatırlandı i Işıksızdır.
this_thread::sync_wait Yürütme çerçevesindeki vericilerin tek tüketicisidir.
Sırada ne var?
Bir sonraki makalemde daha zorlu bir algoritmayı analiz edeceğim.
(RME)
C ++ Programlama Dili: CSTD :: Yürütme: Asenkron algoritmalar
Genel fikre göre std::execution Önceki blog yazımda kendimi özelleştirilebilir asenkron algoritmalara adadım.

P2300R10 teklifini sunmak kolay değildir. Her şeyden önce, güçlü ve ikincisi çok uzun. Bu nedenle, bazı yönlere odaklanıyorum.

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
C ++ modeli için öncelikler
Teklif için çok sayıda öncelik geçerlidir. Asenkron kod için C ++ modeli
- Kullanıcıların birçok farklı yürütme kaynağı türüyle kullanılabilecek bir kod yazabilmeleri için tamamlanacak ve jenerik.
- Kullanıcıların her şeyi kendileri icat etmek zorunda kalmayacak şekilde, ortak eşzamansız modelleri uyarlanabilir ve yeniden kullanılabilir algoritmalarda birleştirin.
- İnşaat yoluyla düzeltilmeyi kolaylaştırın.
- Tüm yürütme aracıları eşit olmadığından, yürütme kaynaklarının ve yürütme aracılarının çeşitliliğini desteklemektedir; Bazıları diğerlerinden daha az güçlüdür, ancak daha az önemli değildir.
- Her şeyin diğer yürütme kaynaklarına aktarım da dahil olmak üzere bir yürütme kaynağı tarafından düzenlenebilmesini sağlayın, ancak yürütme kaynaklarının her şeyi uyarlamasını gerektirmez –
Tüm kullanım durumları, hassas alanlar ve platformlar dikkate alınır. - Hataların iletildiğinden emin olun, ancak hata tedavisi bir ağırlık değildir.
- Bir hata olmayan yıkımı destekleyin.
- Açık ve hassas cevaplar, işlerin yapıldığı yerlere sahiptir.
- Asenkron nesnelerin ömrünü yönetebilir ve bitirebilir.
A Yürütme kaynağı Bir dizi yürütme aracısını yöneten programın bir kaynak birimidir. Yürütme kaynaklarına örnekler aktif iş parçacığı, bir iş parçacığı havuzu veya ek bir donanım hızlandırıcısıdır.
Her işlev çağrısı bir İnfaz acentesi gerçekleştirildi.
A Zamanlayıcı Bu kaynak üzerinde çalışma planlaması için tek tip ve jenerik bir arayüze sahip bir yürütme kaynağının soyutlamasıdır. Gönderen için bir fabrika.
Selam Dünya
İşte “Merhaba Dünya” programı std::execution. Bu kez program derleyicinin kaşifinde gerçekleştirilebilir ve analizim daha derine inecektir.
// HelloWorldExecution.cpp
#include <exec/static_thread_pool.hpp>
#include <iostream>
#include <stdexec/execution.hpp>
int main() {
exec::static_thread_pool pool(8);
auto sch = pool.get_scheduler();
auto begin = stdexec::schedule(sch);
auto hi = stdexec::then(begin, [] {
std::cout << "Hello world! Have an int.n";
return 13;
});
auto add_42 = stdexec::then(hi, [](int arg) { return arg + 42; });
auto = stdexec::sync_wait(add_42).value();
std::cout << "i = " << i << 'n';
}
Her şeyden önce, program baskısı:

Program, istenen kurulumun entegrasyonu ile başlar:exec/static_thread_pool.hpp> Bir iplik havuzunun oluşturulması için estdexec/execution.hpp> Yürütme ile ilgili yardımcı programlar için.
İçinde main İşlev bir static_thread_pool pool Sekiz iş parçacığı ile oluşturuldu.
Üye işlevi get_scheduler İplik havuzu, yürütme kaynakları programı için hafif bir ticarete çağrılır. sch İplik havuzundaki yayıncıları planlamak için kullanılacak. Bu durumda, yürütme kaynağı bir iş parçacığı havuzudur, ancak ana iş parçacığı, GPU veya bir faaliyet çerçevesi de olabilir
Bu nedenle program, yürütme aracıları tarafından gerçekleştirilen bir dizi vericiyi oluşturur.
İlk Verici begin İşlevle stdexec::schedule Belirtilen zamanlayıcıda bir vericinin sch Bitki. stdexec::schedule Bu sözde vericiler fabrikasıdır. Başka kanallar var. Bir sonraki standardın adlarının adını kullanıyorum:
Bir sonraki istasyon hi Verici adaptörünü kullanın stdexec::thenVerici begin Ve bir lambda işlevi kullandı. Bu lambda işlevi verir “Hello world! Have an int.. “Konsola ve tüm değeri ver 13 Geriye doğru. Üçüncü Verici add_42 aynı zamanda verici adaptörü ile de stdexec::then oluşturuldu. Devam filmi kontrolünü ele alıyor hi Görev ve başka bir lambda arg kabul eder ve eklenmesinin sonucu 42 geri gelmek. Mcitchi asenkron yapılır ve genellikle bestelenir.
std::execution Daha fazla vericilik adaptörleri sunar:
execution::continues_on
execution::then
execution::upon_*
execution::let_*
execution::starts_on
execution::into_variant
execution::stopped_as_optional
execution::stopped_as_error
execution::bulk
execution::split
execution::when_all
Vericilerin aksine, verici tüketicisi eşzamanlı olarak gerçekleştirilir. . stdexec::sync_wait-Çağrı tamamlanmasını bekliyor add_42-Mitnts. . value-Method sonucu için sync_wait değişken içinde olan verici tarafından üretilen değeri elde etmek için hatırlandı i Işıksızdır.
this_thread::sync_wait Yürütme çerçevesindeki vericilerin tek tüketicisidir.
Sırada ne var?
Bir sonraki makalemde daha zorlu bir algoritmayı analiz edeceğim.
(RME)