fork () vs std :: async C ++ 'da

Sep 01 2020

Asyc ve fork kavramlarında yeniyim, şimdiye kadar anladığım şey, fork () 'un asenkron olarak çalışacak chid süreçleri yarattığıdır. Ve std :: async, sistem havuzundan bir iş parçacığı yaratacak ve std :: launch :: async'den bahsedersem, burada asenkron olarak başlatacak .

Örneğin aşağıdaki kod seti nasıl farklılık gösterir? 1: std :: async kullanma

std::vector<std::future<void>> result;
for(i=0;i<5;i++){
    result. push_back(std::async(std::launch::asyc, foo, var1));
}

for( auto e : result) 
    e.get();

2: Çatalı () kullanma

for(i=0;i<5;i++){ 
    if(fork()==0){
        foo(var1);
        exit(0);
    }
}

Foo işlevi dönüş türünün void olduğunu ve argümanların başvuru veya işaretçiler olarak iletildiğini varsayın.

Yanıtlar

2 DavidSchwartz Sep 01 2020 at 05:28

Temel fark, std::asynciki yürütme iş parçacığının bir süreci paylaşmasıdır. Durumda fork, her birinin kendi süreci var.

Bu fark, en çok aramadan sonra değişen şeyleri etkiler. Böyle bir durumda fork, her işlem daha sonra kendi dosya tanımlayıcılarını açıp kapatabilir, kendi bellek alanını yönetebilir vb. Bu durumda std::async, iş parçacıkları dosya tanımlayıcılarını, bellek alanını vb. Paylaşmaya devam eder.

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()çağıran süreci kopyalayarak bir alt süreç oluşturur . Alt süreç ana süreçten ayrılır, böylece her birinin kendi hafızası vardır ve süreçler arası herhangi bir iletişim kanalı kurmadan iki süreç arasında veri aktarımı imkansızdır. Çağrının en yaygın kullanım örneği, fork()bir işlemi arka plan hizmeti (aka "arka plan programı") olarak başlatmaktır. Örneğin, favori web sunucunuzu komut satırında başlattığınızda, bir çocuk süreci (gerçek sunucu süreci) çatallayabilir. Bu yapıldıktan sonra ana işlem sona erer, böylece kontrol kabuğunuza geri döner ve başka şeyler yapabilirsiniz.

std::async

std::asyncayrı bir iş parçacığında bir işlevi yürütür (ilke varsayarak std::launch::async) İşlev tarafından döndürülen değeri almak için std::futureçağırabileceğiniz bir döndürür get()(döndüğünü ve bir istisna oluşturmadığını varsayarak). Bu get()arada işlev tamamlanmışsa çağrı hemen geri döner, aksi takdirde işlev dönene kadar bloke olur. Bu özellik, std::asyncbaşka bir şey yaparken arka planda pahalı hesaplamalar çalıştırmak için kullanışlı bir araç haline getirir .