2012-02-13 17 views
9

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

+0

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? –

+6

@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

cevap

6

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.

+0

İ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). –