fork () เทียบกับ std :: async ใน C ++

Sep 01 2020

ฉันยังใหม่กับแนวคิดของ asyc และ fork สิ่งที่ฉันเข้าใจจนถึงตอนนี้ก็คือ fork () สร้างกระบวนการ chid ซึ่งจะทำงานแบบอะซิงโครนัส และมาตรฐาน :: async จะสร้างด้ายจากสระว่ายน้ำระบบและเปิดใช้งานแบบไม่พร้อมกันที่นี่ถ้าฉันพูดถึงมาตรฐาน :: เปิดตัว :: async

ตัวอย่างเช่นชุดรหัสด้านล่างแตกต่างกันอย่างไร 1: ใช้ 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();

2nd: การใช้ส้อม ()

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

สมมติว่าประเภทการส่งคืนฟังก์ชัน foo เป็นโมฆะและอาร์กิวเมนต์จะถูกส่งผ่านเป็นการอ้างอิงหรือตัวชี้

คำตอบ

2 DavidSchwartz Sep 01 2020 at 05:28

ความแตกต่างที่สำคัญคือในกรณีของstd::asyncการดำเนินการสองเธรดจะใช้กระบวนการร่วมกัน ในกรณีของforkพวกเขาแต่ละคนมีกระบวนการของตัวเอง

ความแตกต่างนี้ส่งผลอย่างมีนัยสำคัญที่สุดต่อสิ่งที่เปลี่ยนแปลงหลังการโทร ในกรณีของforkแต่ละกระบวนการสามารถเปิดและปิดตัวอธิบายไฟล์ของตัวเองจัดการพื้นที่หน่วยความจำของตัวเองและอื่น ๆ ในกรณีของstd::asyncเธรดจะยังคงแบ่งใช้ตัวอธิบายไฟล์พื้นที่หน่วยความจำและอื่น ๆ

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()สร้างกระบวนการย่อยโดยทำซ้ำกระบวนการโทร กระบวนการลูกถูกแยกออกจากกระบวนการหลักดังนั้นแต่ละกระบวนการจึงมีหน่วยความจำของตนเองและไม่มีการตั้งค่าช่องทางการสื่อสารระหว่างกระบวนการใด ๆ จึงเป็นไปไม่ได้ที่จะส่งผ่านข้อมูลระหว่างสองกระบวนการ กรณีการใช้งานที่พบบ่อยที่สุดสำหรับการโทรfork()คือการเริ่มกระบวนการเป็นบริการพื้นหลัง (aka "daemon") ตัวอย่างเช่นเมื่อคุณเริ่มต้นเว็บเซิร์ฟเวอร์ที่คุณชื่นชอบในบรรทัดคำสั่งอาจแยกกระบวนการย่อยออกไป (กระบวนการเซิร์ฟเวอร์จริง) เมื่อดำเนินการเสร็จสิ้นกระบวนการหลักจะสิ้นสุดลงดังนั้นการควบคุมจะกลับไปที่เชลล์ของคุณและคุณสามารถทำสิ่งอื่น ๆ ได้

std::async

std::asyncเรียกใช้ฟังก์ชันในเธรดแยกต่างหาก(สมมติว่าเป็นนโยบายstd::launch::async) ส่งคืนค่าstd::futureที่คุณสามารถเรียกget()เพื่อรับค่าที่ฟังก์ชันส่งคืน (สมมติว่าส่งคืนและไม่ส่งข้อยกเว้น) การget()โทรจะส่งกลับทันทีหากฟังก์ชันเสร็จสิ้นในระหว่างนี้มิฉะนั้นจะบล็อกจนกว่าฟังก์ชันจะกลับมา คุณลักษณะนี้std::asyncเป็นเครื่องมือที่มีประโยชน์สำหรับการเรียกใช้การคำนวณราคาแพงในพื้นหลังในขณะที่ทำอย่างอื่น