fork () vs std :: async di C ++
Saya baru mengenal konsep asyc dan fork, yang saya pahami sampai sekarang adalah bahwa fork () membuat proses chid yang akan berjalan secara asynchronous. Dan std :: async akan membuat utas dari kumpulan sistem dan meluncurkannya secara asinkron di sini jika saya menyebutkan std :: launch :: async .
Misalnya, bagaimana set kode di bawah ini berbeda? 1: menggunakan std :: async
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: Menggunakan garpu ()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
Asumsikan jenis kembalian fungsi foo kosong, dan argumen diteruskan sebagai referensi atau pointer.
Jawaban
Perbedaan utamanya adalah dalam kasus std::async, dua alur eksekusi berbagi proses. Dalam kasus fork, mereka masing-masing memiliki prosesnya sendiri.
Perbedaan ini paling signifikan memengaruhi hal-hal yang berubah setelah panggilan. Dalam kasus fork, setiap proses kemudian dapat membuka dan menutup deskriptor filenya sendiri, mengelola ruang memorinya sendiri, dan seterusnya. Dalam kasus std::async, utas terus berbagi deskriptor file, ruang memori, dan sebagainya.
fork()
fork()membuat proses anak dengan menduplikasi proses panggilan. Proses anak terlepas dari proses induk sehingga masing-masing memiliki memori sendiri dan tanpa menyiapkan saluran komunikasi antar proses tidak mungkin melewatkan data di antara kedua proses. Kasus penggunaan yang paling umum untuk memanggil fork()adalah memulai proses sebagai layanan latar belakang (alias "daemon"). Misalnya ketika Anda memulai server web favorit Anda pada baris perintah, itu mungkin memotong proses anak (proses server yang sebenarnya). Setelah selesai, proses utama berakhir sehingga kontrol kembali ke shell Anda dan Anda dapat melakukan hal lain.
std::async
std::asyncmenjalankan fungsi di utas terpisah (dengan asumsi kebijakan std::launch::async). Ini mengembalikan std::futuredi mana Anda bisa memanggil get()untuk mendapatkan nilai yang dikembalikan oleh fungsi (dengan asumsi itu dikembalikan dan tidak mengeluarkan pengecualian). The get()panggilan kembali segera jika fungsi telah menyelesaikan sementara itu, jika tidak maka blok sampai fungsi telah kembali. Fitur ini membuat std::asyncalat yang berguna untuk menjalankan komputasi mahal di latar belakang saat melakukan hal lain.