fork () เทียบกับ std :: async ใน C ++
ฉันยังใหม่กับแนวคิดของ 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 เป็นโมฆะและอาร์กิวเมนต์จะถูกส่งผ่านเป็นการอ้างอิงหรือตัวชี้
คำตอบ
ความแตกต่างที่สำคัญคือในกรณีของstd::asyncการดำเนินการสองเธรดจะใช้กระบวนการร่วมกัน ในกรณีของforkพวกเขาแต่ละคนมีกระบวนการของตัวเอง
ความแตกต่างนี้ส่งผลอย่างมีนัยสำคัญที่สุดต่อสิ่งที่เปลี่ยนแปลงหลังการโทร ในกรณีของforkแต่ละกระบวนการสามารถเปิดและปิดตัวอธิบายไฟล์ของตัวเองจัดการพื้นที่หน่วยความจำของตัวเองและอื่น ๆ ในกรณีของstd::asyncเธรดจะยังคงแบ่งใช้ตัวอธิบายไฟล์พื้นที่หน่วยความจำและอื่น ๆ
fork()
fork()สร้างกระบวนการย่อยโดยทำซ้ำกระบวนการโทร กระบวนการลูกถูกแยกออกจากกระบวนการหลักดังนั้นแต่ละกระบวนการจึงมีหน่วยความจำของตนเองและไม่มีการตั้งค่าช่องทางการสื่อสารระหว่างกระบวนการใด ๆ จึงเป็นไปไม่ได้ที่จะส่งผ่านข้อมูลระหว่างสองกระบวนการ กรณีการใช้งานที่พบบ่อยที่สุดสำหรับการโทรfork()คือการเริ่มกระบวนการเป็นบริการพื้นหลัง (aka "daemon") ตัวอย่างเช่นเมื่อคุณเริ่มต้นเว็บเซิร์ฟเวอร์ที่คุณชื่นชอบในบรรทัดคำสั่งอาจแยกกระบวนการย่อยออกไป (กระบวนการเซิร์ฟเวอร์จริง) เมื่อดำเนินการเสร็จสิ้นกระบวนการหลักจะสิ้นสุดลงดังนั้นการควบคุมจะกลับไปที่เชลล์ของคุณและคุณสามารถทำสิ่งอื่น ๆ ได้
std::async
std::asyncเรียกใช้ฟังก์ชันในเธรดแยกต่างหาก(สมมติว่าเป็นนโยบายstd::launch::async) ส่งคืนค่าstd::futureที่คุณสามารถเรียกget()เพื่อรับค่าที่ฟังก์ชันส่งคืน (สมมติว่าส่งคืนและไม่ส่งข้อยกเว้น) การget()โทรจะส่งกลับทันทีหากฟังก์ชันเสร็จสิ้นในระหว่างนี้มิฉะนั้นจะบล็อกจนกว่าฟังก์ชันจะกลับมา คุณลักษณะนี้std::asyncเป็นเครื่องมือที่มีประโยชน์สำหรับการเรียกใช้การคำนวณราคาแพงในพื้นหลังในขณะที่ทำอย่างอื่น