Unix ortamlarında, makecontext()/swapcontext()
işlev ailesi, bazen C içinde coroutines uygulamak için kullanılır. Ancak, bu işlevler yığın ve yürütme akışını doğrudan manipüle eder. Çoğu zaman bu düşük seviyeli fonksiyonlar C'den C++'ya geçerken oldukça farklıdır. makecontext()
ve swapcontext()
kullanarak, koroutinin uygulanmasıyla ilgili herhangi bir sorun varsa, soru şudur: Kuşkusuz ki, elbette ki, bir istisnanın böyle bir koroutinden kaçamayacağı açıktır, çünkü bunun için bir istisna eylemcisi olmayacak ve program büyük olasılıkla segfault olacaktır. Ancak bunun dışında C++ işlemlerini içsel olarak işler ve makecontext()
ve setcontext()
yürütme yolunu değiştirmek arasında herhangi bir uyumsuzluk var mı?makecontext()/swapcontext() işlevleri, C++ uyumlu
cevap
Daha önce C++ koduyla makecontext()
/swapcontext()
kullandım ve söylediğiniz gibi, dikkat etmeniz gereken ana şey istisnalardır. Bunun ötesinde bir sorunum olmadı. Standartlara göre eskime rağmen, hala unix benzeri işletim sistemleri tarafından desteklenmektedir. (Mac OS X için bir uyarı var: #define _XOPEN_SOURCE
, #including
önce ilgili üstbilgiler var.) Onları eski yapmak için mantık çok tatlıdır - onlar, işlev işaretçisinin aldığı pthreads benzeri bir sürümle değiştirmiş olabilirler. tek bir boşluk * argümanı.
Dediğiniz gibi, iş parçacıkları kullanışlı bir alternatif değildir, dolayısıyla devam edip swapcontext()
kullanın. Ayrıca, kendi fonksiyonlarınızın kendi versiyonunu yuvarlamak için this blog post'u da bulabilirsiniz.
İlginç gönderi (en iyi koroutin kullanımını hissettiğim halde büyük ihtimalle ince dilimleme ya da kısa ömürlü örnekler için geçerli değildir, bu nedenle söz edilen ek yükler en kötü durum olabilir). Her neyse, ekleyerek istisnalar atmaktan kaçınıyorum ve/C++ projesinde make/swapcontext (ve Windows fiberlerinden ditto) kullanarak hiçbir sorun yaşamadım (http://code.google.com/p/crag/source/browse/ src/SMP/FiberPosix.cpp). –
- 1. C++ STL uyumlu Allocators
- 2. Call Go işlevleri C
- 3. ES6 ok işlevleri Angular ile uyumlu değil mi?
- 4. PHP uyumlu seri hale getirme C/C++
- 5. "C" işlevleri olan bir C++ kütüphanesine bağlanma
- 6. C++ Vektör Matematik ve OpenGL uyumlu
- 7. C++ 14 kısıtlanmamış genel işlevleri destekleyecek mi?
- 8. C++ protobuf, ZMQ. İstemci-sunucu arabiriminin işlevleri
- 9. C++ 'da Üye İşlevleri ile Okuma Dosyası
- 10. Matematik işlevleri "make" ile çalışmayan C
- 11. Kısmi Sınıf İşlevinde Geçersiz Kılma İşlevleri C++
- 12. C# bu işlevleri inline edecek mi?
- 13. Bazı paketler bulundu, uyumlu sürümleri uyumlu değil.
- 14. Olmayan uyumlu diziler hata
- 15. Protokolle uyumlu Swift uzantısı
- 16. Önek uzantısı işlevleri
- 17. Nitelikler birbiriyle uyumlu değil mi?
- 18. Sevkiyat işlevleri
- 19. Toplama işlevleri
- 20. C++ AMP uyumlu bir GPU'suz bir makinede çalışır mı?
- 21. statik üye işlevleri devralma
- 22. ReactJs Global Helper İşlevleri
- 23. Uyumlu brace git
- 24. OpenCL uyumlu DSP
- 25. piton 2.7 eşdeğer uyumlu
- 26. F #: Aşırı yükleme işlevleri
- 27. MediaWiki şablonunda dize işlevleri?
- 28. bağlayıcı eleman işlevleri variadic moda
- 29. codeblocks otomatik tamamlama/calltips C standart kitaplık işlevleri için çalışmıyor
- 30. "= 0;" nedir? C++ 'da saf sanal işlevleri bildirirken ne yaparsınız?
Bu işlevleri hiç duymamıştım. [POSIX 2001] 'in (http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html), onları iş parçacıklarının lehine eskimiş olduğunun farkında mısınız? –
@larsmans: Yazık. Koroutinler ile kolay olan şeyler ipliklerle çok daha zordur. Evet, siz * koroutinleri iş parçacığıyla öykünebilir, ancak yalnızca baş üstü (senkronizasyon!) Ile ve yalnızca bir iş parçacığı, diğerlerinin engellenmesiyle herhangi bir zamanda çalıştığı zaman, aslında iş parçacığının ne anlama geldiği önemli değildir. – celtschk