18.1 The High-Level Interface: async() and Futures 961}return num;}voi การแปล - 18.1 The High-Level Interface: async() and Futures 961}return num;}voi ไทย วิธีการพูด

18.1 The High-Level Interface: asyn

18.1 The High-Level Interface: async() and Futures 961
}
return num;
}
void doSomething (char c, shared_future f)
{
try {
// wait for number of characters to print
int num = f.get(); // get result of queryNumber()
for (int i=0; i
0/5000
จาก: -
เป็น: -
ผลลัพธ์ (ไทย) 1: [สำเนา]
คัดลอก!
18.1 อินเทอร์เฟซพื้นฐาน: async() และในอนาคต 961
}
กลับ num;
}
doSomething ยกเลิก (อักขระ c, shared_future f)
{
ลอง {
/ / รอจำนวนอักขระพิมพ์
int num = f.get(); / / ได้รับผลของ queryNumber ()
สำหรับ (int ฉัน = 0 ฉัน < num ค่ะ {
this_thread::sleep_for(chrono::milliseconds(100)),
cout.put (c) .flush ();
}
}
จับ (ค่า const exception& e) {
cerr << "ข้อยกเว้นในหัวข้อ" << this_thread:: get_id()
<< ": " << e.what() << endl;
}
}
int ()หลัก
{
ลอง {
/ / เริ่มกระทู้หนึ่งสอบถามหมายเลข
shared_future f = async(queryNumber);
/ / เริ่มต้นสามกระทู้แต่ละหมายเลขนี้ในการวนรอบประมวลผล
ยนต์ f1 =ต่างเวลา (launch::async, doSomething ', f);
อัตโนมัติ f2 =ต่างเวลา (launch::async, doSomething ', f);
อัตโนมัติ f3 = async(launch::async,doSomething,'*',f);
/ / รอวนรอบทั้งหมดจะเสร็จ
f1.get ()
f2.get ()
f3.get ();
}
จับ (ค่า const exception& e) {
cout << "
EXCEPTION: " << e.what() << endl;
}
cout << "
done" << endl;
}
www.it-ebooks.info
962 บท 18: เกิด
ในตัวอย่างนี้ ด้ายหนึ่งเรียก queryNumber() สอบถามเป็นค่า ซึ่งถูกใช้แล้วโดย
กระทู้อื่น ๆ แล้วทำงาน การทำงานนี้ ผลของ std::async() ซึ่งเริ่มต้น
สอบถามด้าย ได้รับการกำหนดให้วัตถุ shared_future ความสำหรับค่าที่ส่งคืน:
shared_future f =ต่างเวลา (queryNumber);
ดังนั้น จึง สามารถเริ่มต้นอนาคตร่วม โดยอนาคตธรรมดา ซึ่งย้ายสถานะจาก
ในอนาคตอนาคตร่วมกันได้ สามารถใช้รถยนต์สำหรับการรายงานนี้ คุณสามารถ หรือ ใช้ฟังก์ชันสมาชิก the
share():
f อัตโนมัติ =ต่างเวลา (queryNumber) .share ();
ภายใน วัตถุทั้งหมดในอนาคตร่วมกันร่วมรัฐร่วม async() ที่สร้างเพื่อเก็บผล
ผ่านฟังก์ชัน (และเก็บงานเองถ้าได้รอการตัดบัญชี) .
อนาคตร่วมกันแล้วได้ส่งผ่านไปยังหัวข้ออื่น เริ่ม doSomething() ที่ใช้ร่วมกัน
ในอนาคตเป็นอาร์กิวเมนต์ที่สอง:
ยนต์ f1 =ต่างเวลา (launch::async, doSomething ', f);
อัตโนมัติ f2 =ต่างเวลา (launch::async, doSomething ',f);
อัตโนมัติ f3 =ต่างเวลา (launch::async, doSomething ', f);
ภายในแต่ละสายของ doSomething() เรารอ และประมวลผลของ queryNumber() โดย calling
get() ในอนาคตร่วมกันผ่าน:
doSomething ยกเลิก (อักขระ c, shared_future f)
{
ลอง {
int num = f.get(); / / ได้รับผลของ queryNumber ()
...
}
จับ (ค่า const exception& e) {
cerr << "ข้อยกเว้นในหัวข้อ" << this_thread::get_id()
<< ": " << e.what() << endl;
}
}
ถ้า queryNumber() พ่นยกเว้น ซึ่งเกิดขึ้นถ้าค่าไม่เป็นสามารถอ่าน แต่ละ
โทร doSomething() จะได้รับข้อยกเว้นนี้ ด้วย f.get() ให้ข้อยกเว้นที่เกี่ยวข้อง
จัดการจะเกิดขึ้นได้
ดัง หลังจากอ่านค่า 5 เป็นอินพุท เอาท์พุทอาจ:
อ่านเลข: 5
* ได้ * การ * ได้ * .*.
ทำ
แต่ ถ้าพิมพ์ 'x' เป็นอินพุท เอาท์พุทอาจ:
จำนวนอ่าน: x
ข้อยกเว้นในหัวข้อ 3: อ่านหมายเลขไม่
ข้อยกเว้นในหัวข้อ 4: อ่านหมายเลขไม่
ข้อยกเว้นในหัวข้อที่ 2: อ่านหมายเลขไม่
ทำ
www.it-ebooks.info
18.1 อินเตอร์เฟซ High-Level: async() และในอนาคต 963
หมายเหตุว่าลำดับของหัวข้อแสดงผลและค่า ID ไม่ได้กำหนด (ดู 18.2.1,
page ส่วน 967 รายละเอียดเกี่ยวกับหัวข้อรหัส)
โปรดสังเกตด้วยว่า มีความแตกต่างเล็กน้อยในการรายงานของ get() ระหว่างอนาคต และ
shared_future:
•สำหรับคลา<>ในอนาคต ให้ดัง (T คือ ชนิดของค่าที่ส่งคืน) get():
T อนาคต :: get(); / / ทั่วไปได้รับ()
อนาคต T& :: get(); / / ความเชี่ยวชาญสำหรับการอ้างอิง
โมฆะอนาคต :: get(); / / ความเชี่ยวชาญการโมฆะ
ซึ่งแบบแรกส่งกลับผลลัพธ์ที่ย้ายหรือคัดลอกของผล
•สำหรับคลาส shared_future <> get() ให้เป็นดังนี้:
ค่า const T& shared_future :: get(); / / ทั่วไปได้รับ()
T& shared_future < T& >:: get(); / / ความเชี่ยวชาญสำหรับอ้างอิง
โมฆะ shared_future :: get(); / / ความเชี่ยวชาญการโมฆะ
ซึ่งแบบแรกส่งกลับการอ้างอิงค่าผลลัพธ์ที่เก็บไว้ในที่ร่วมใช้ร่วมรัฐ
หรือ อเมริกา [N3194:Futures]:
" get() เดียวใช้ค่าถูกปรับย้าย (เช่น std::vector < int > v = f.get())...
get() อ้างอิงค่าคงจะเข้าถึงที่เหมาะ (เช่น int ฉัน = f.get() [3]) "
ออกแบบนี้แนะนำความเสี่ยงของอายุการใช้งาน หรือปรับเปลี่ยนข้อมูลการแข่งขันปัญหาถ้าส่งกลับค่า (ดู
ส่วน 18.3.3 หน้า 977 รายละเอียด) .
นอกจากนี้คุณยังสามารถผ่านในอนาคตร่วมกัน โดยการอ้างอิง (นั่นคือ ประกาศอ้างอิง และใช้
std::ref() ผ่านมัน):
doSomething ยกเลิก (อักขระ c ค่า const shared_future & f)
ยนต์ f1 = async(launch::async,doSomething,'.',std::ref(f));
แทนการใช้หลายวัตถุในอนาคตร่วมกันร่วมกันรัฐใช้ร่วมกันเดียวกันทั้งหมด คุณต้องใช้หนึ่ง
วัตถุในอนาคตร่วมกันทำหลายที่ได้รับ()เป็น (หนึ่งในแต่ละหัวข้อ) อย่างไรก็ตาม วิธีการนี้เป็น
มีความเสี่ยงมากขึ้น เป็นโปรแกรมเมอร์ คุณต้องให้แน่ใจว่าอายุการใช้งานของ f (ใช่ f ไม่ร่วมรัฐ
อ้าง) มีขนาดเล็กกว่าสำหรับเธรดที่เริ่มต้น นอกจากนี้ โปรดทราบว่า ฟังก์ชันสมาชิกของ
ตรงในอนาคตร่วมกัน ด้วยตัวเอง แม้ว่าการใช้ร่วมกันที่ใช้ร่วมกัน ตรงสถานะการ
ดังนั้น ถ้าคุณมากกว่าเพียงแค่อ่านข้อมูล คุณอาจต้องเทคนิคการซิงโครไนส์ภายนอก (ดูส่วน
18.4 หน้า 982) เพื่อหลีกเลี่ยงการแข่งขันข้อมูล ซึ่งจะส่งผลในการทำงานไม่ได้ หรือลอว์เรนซ์
Crowl ผู้เขียนของไลบรารีพร้อมกัน หนึ่งเขียนในการสื่อสารส่วนตัว: "ถ้ารหัส
ยังคงแน่นประสาน ผ่านมาอ้างอิงได้ดี ถ้ารหัสอาจเผยแพร่ในภูมิภาคด้วย
ความเข้าใจที่สมบูรณ์ของวัตถุประสงค์และข้อจำกัด ช่วย ด้วยค่าจะดีกว่า คัดลอกการ
อนาคตร่วมจะมีราคาแพง แต่ไม่คุ้มเป็นจัดชิดขอบข้อบกพร่องแฝงอยู่ในระบบขนาดใหญ่ "
สำหรับเพิ่มเติม รายละเอียดของคลาส shared_future ดูส่วน 18.3.3 หน้า 976.
www.it-ebooks.info
964 บท 18: เกิด
182 กระทู้อินเทอร์เฟซที่ระดับต่ำ: และสัญญา
นอกจากอินเทอร์เฟซที่ระดับสูงของ async() และในอนาคต (ร่วม) ไลบรารีมาตรฐาน C ให้
อินเตอร์เฟซระดับล่างเพื่อเริ่มเธรด และจัดการกับการ
18.2.1 คลา std::thread
เริ่มเธรด คุณก็จะต้องประกาศเป็นวัตถุของคลาส std::thread และผ่านที่ต้อง
งานเป็นอาร์กิวเมนต์แรก แล้วรอจุดสิ้นสุด หรือถอดได้:
ยกเลิก doSomething ();
std::thread t(doSomething) / / เริ่ม doSomething() background
...
t.join() / / รอทีวาย (บล็อกจนกว่าสิ้นสุด doSomething())
สำหรับ async() คุณสามารถส่งสิ่งที่เป็นวัตถุ callable (สมาชิกฟังก์ชัน ฟังก์ชัน ฟังก์ชัน
วัตถุ แลมบ์ดา ดูส่วน 4.4 หน้า 54) กับอาร์กิวเมนต์สามารถเพิ่มเติมได้ อย่างไรก็ตาม,
หมายเหตุอีกว่า ยกเว้นว่าคุณทราบจริง ๆ สิ่งที่คุณทำ คุณควรผ่านวัตถุทั้งหมดจำเป็นต้อง
ประมวลผลฟังก์ชันส่งผ่าน โดยค่าที่เธรดใช้เฉพาะสำเนา (ดูส่วน 18.4,
หน้า 982 สำหรับบางปัญหาที่อาจเกิดขึ้นหรือ) .
, นี้เป็นอินเตอร์เฟซที่ระดับต่ำ ดังนั้นสิ่งน่าสนใจคือ อะไรอินเทอร์เฟซนี้ไม่ได้
ให้เปรียบเทียบกับ async() (ดูหัวข้อ 18.1 หน้า 946):
•ชั้นด้ายไม่มีนโยบายเปิดการ ไลบรารีมาตรฐาน C เสมอพยายามที่จะเริ่มต้น
ผ่านฟังก์ชันในหัวข้อใหม่ ถ้านี้ไม่สามารถ พ่นเป็น std::system_error (ดู
ส่วน 4.3.1 หน้า 43) ด้วย resource_unavailable_try_again รหัสข้อผิดพลาด (ดูส่วน
4.3.2 หน้า 45)
•คุณมีอินเทอร์เฟซไม่ให้ประมวลผลหรือผลลัพธ์ของเธรด สิ่งเดียวที่คุณจะได้รับ
รหัสหัวข้อเฉพาะ (ดูหัวข้อ 18.2.1 หน้า 967) .
•หากเกิดข้อยกเว้นที่ไม่ได้ติดอยู่ภายในเธรด โปรแกรมทันที aborts เรียก
std::terminate() (ดูหัวข้อ 5.8.2 หน้า 162) ผ่านข้อยกเว้นกับบริบทภายนอก
exception_ptrs ด้าย (ดูหัวข้อ 4.3.3 หน้า 52) จำเป็นต้องใช้
•คุณต้องประกาศ เป็นผู้เรียก ต้องรอการสิ้นสุดของเธรด (calling
join()) หรือ การแยกออกจากเธรดที่เริ่มต้นเพื่อให้โปรแกรมทำงานในพื้นหลังโดยไม่มีการควบคุมใด ๆ
(calling detach()). ถ้าคุณไม่ทำเช่นนี้ก่อนอายุการใช้งานของวัตถุปลายด้ายหรือย้าย
กำหนดจะเกิดขึ้น aborts โปรแกรม เรียกมาตรฐาน::terminate() (เห็นส่วน 5.8.2,
page 162) .
•ถ้าคุณให้เธรดที่รันในปลายของพื้นหลังและ main() เธรดทั้งหมดจะยกเลิกกะทันหัน
นี่เป็นตัวอย่างที่สมบูรณ์ครั้งแรก:
/ / concurrency/thread1.cpp
#include
#include
www.it-ebooks.info
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 2:[สำเนา]
คัดลอก!
18.1 ระดับสูง Interface: async () และฟิวเจอร์ส 961
}
กลับ NUM;
}
doSomething โมฆะ (ถ่าน C, shared_futureฉ)
{
try {
/ / รอจำนวนตัวอักษรที่จะพิมพ์
NUM int = f.get () / / ได้รับผลจากการ queryNumber ()
for (int i = 0; ฉันthis_thread :: sleep_for (โครโนกราฟ :: มิลลิวินาที (100));
. cout.put (c) ล้าง ();
}
}
catch (ยกเว้น const และ e) {
cerr << "ข้อยกเว้นในหัวข้อ" << this_thread :: get_id ()
<< ":" << e.what () << endl;
}
}
int หลัก ()
{
try {
/ / เริ่มต้นหนึ่งด้ายเพื่อสอบถามจำนวน
shared_futuref = async (queryNumber);
/ / เริ่มต้นสามหัวข้อการประมวลผลแต่ละจำนวนนี้ในวง
async f1 อัตโนมัติ = (การเปิดตัว :: async, doSomething, ฉ '.');
f2 รถยนต์ = async (เปิดตัว :: async, doSomething, '+', ฉ);
f3 รถยนต์ = async (เปิดตัว :: async, doSomething, '*', ฉ);
/ / รอลูปทั้งหมดจะแล้วเสร็จ
f1.get ();
f2.get ();
f3.get ();
}
catch (ยกเว้น const และ e) {
ศาล << " nEXCEPTION:" << e.what () << endl;
}
ศาล << " ndone" << endl;
}
www.it-ebooks.info
962 บทที่ 18: Concurrency
ในตัวอย่างนี้ด้ายเรียก queryNumber () เพื่อสอบถามค่าหนึ่งซึ่งถูกนำมาใช้แล้วโดย
หัวข้ออื่น ๆ ทำงานอยู่แล้ว การดำเนินการนี้เป็นผลมาจากมาตรฐาน :: async () ซึ่งจะเริ่มต้น
ด้ายแบบสอบถามได้รับมอบหมายให้เป็นวัตถุ shared_future, พิเศษสำหรับค่าตอบแทน:
shared_futureฉ async = (queryNumber);
ดังนั้นในอนาคตที่ใช้ร่วมกันสามารถเริ่มต้นได้โดยในอนาคตสามัญซึ่งย้ายจากรัฐ
ในอนาคตที่จะใช้ร่วมกันในอนาคต เพื่อให้สามารถใช้รถยนต์สำหรับการประกาศนี้คุณสามารถผลัดกันใช้
ร่วมกัน () ฟังก์ชันสมาชิก:
. รถยนต์ f = async (queryNumber) หุ้น ();
ภายในวัตถุที่ใช้ร่วมกันทั้งหมดในอนาคตร่วมกันของรัฐที่ใช้ร่วมกันซึ่ง async () สร้างเพื่อเก็บผล
ของการทำงานที่ผ่านมา (และการจัดเก็บฟังก์ชั่นของตัวเองหากมีการเลื่อนเวลาออกไป)
ในอนาคตที่ใช้ร่วมกันจะถูกส่งไปยังหัวข้ออื่น ๆ เริ่มต้น doSomething () ที่มีการใช้ร่วมกัน
ในอนาคตเป็นอาร์กิวเมนต์ที่สอง:
f1 = async อัตโนมัติ (การเปิดตัว :: async, doSomething, ฉ) '.';
f2 รถยนต์ = async (เปิดตัว :: async, doSomething, '+', ฉ);
f3 รถยนต์ = async (เปิดตัว :: async, doSomething, '*', ฉ) ;
ภายในแต่ละสายของ doSomething () เรารอผลและประมวลผลของ queryNumber () โดยการเรียก
รับ () สำหรับอนาคตที่ใช้ร่วมกันผ่าน:
doSomething โมฆะ (ถ่าน C, shared_futureฉ)
{
try {
NUM int = f.get () / / ได้รับผลจากการ queryNumber ()
...
}
catch (ยกเว้น const และ e) {
cerr << "ข้อยกเว้นในหัวข้อ" << this_thread :: get_id ()
< <":" << e.what () << endl;
}
}
หาก queryNumber () พ่นข้อยกเว้นที่เกิดขึ้นถ้าไม่มีค่าหนึ่งสามารถอ่านแต่ละ
สายของ doSomething () จะได้รับการยกเว้นนี้กับ f.get ( ) เพื่อให้ข้อยกเว้นที่สอดคล้องกัน
ในการจัดการที่จะเกิดขึ้น
ดังนั้นหลังจากที่ได้อ่านค่า 5 เป็นอินพุทเอาท์พุทอาจจะ:
จำนวนอ่าน: 5
. * + * + * + * + * +....
ทำ
แต่ถ้าพิมพ์ ' x 'เป็นนำเข้าส่งออกอาจจะ:
จำนวนอ่าน: x
ข้อยกเว้นในหัวข้อที่ 3: จำนวนไม่อ่าน
ข้อยกเว้นในหัวข้อที่ 4: ไม่มีเลขอ่าน
ข้อยกเว้นในหัวข้อที่ 2: จำนวนไม่อ่าน
ทำ
www.it-ebooks.info
18.1 สูง การเชื่อมต่อระดับ: async () และฟิวเจอร์ส 963
ทราบว่าคำสั่งของออกด้ายและค่า ID ที่ไม่ได้กำหนด (ดูมาตรา 18.2.1,
หน้า 967 สำหรับรายละเอียดเกี่ยวกับรหัสด้าย)
นอกจากนี้ยังทราบว่ามีความแตกต่างเล็กน้อยใน ประกาศรับ () ระหว่างในอนาคตและ
shared_future:
•สำหรับอนาคตการเรียน <> รับ () จะให้ดังต่อไปนี้ (T เป็นชนิดของค่ากลับ):
T อนาคต:: ได้รับ () / / รับทั่วไป ()
T & อนาคต:: ได้รับ () / / ความเชี่ยวชาญสำหรับการอ้างอิงใน
อนาคตเป็นโมฆะ:: ได้รับ () / / ความเชี่ยวชาญในการเป็นโมฆะ
ที่รูปแบบแรกจะส่งกลับผลการย้ายหรือสำเนาของผล
•สำหรับ shared_future ชั้น <> รับ () จะให้ดังต่อไปนี้
const T & shared_future:: ได้รับ () / / รับทั่วไป ()
T & shared_future:: ได้รับ () / / ความเชี่ยวชาญสำหรับการอ้างอิง
shared_future โมฆะ:: ได้รับ () / / ความเชี่ยวชาญในการเป็นโมฆะ
รูปแบบครั้งแรกที่ผลตอบแทนอ้างอิงกับค่าผลที่เก็บไว้ในสภาพที่ใช้ร่วมกันที่ใช้ร่วมกัน
หรือเป็น [N3194: ฟิวเจอร์ส] ฯ :
"ค่าใช้ครั้งเดียวจะได้รับ () เป็นย้าย ที่ดีที่สุด (เช่นมาตรฐาน :: เวกเตอร์v = f.get ()) ...
ได้รับการอ้างอิง const () คือการเข้าถึงที่ดีที่สุด (เช่น int i = f.get () [3]). "
การออกแบบนี้จะแนะนำความเสี่ยงของอายุการใช้งานหรือปัญหาการแข่งขันข้อมูลถ้าค่ากลับมาได้รับการแก้ไข (ดู
มาตรา 18.3 3, หน้า 977, สำหรับรายละเอียด)
นอกจากนี้คุณยังสามารถผ่านในอนาคตร่วมกันโดยการอ้างอิง (นั่นคือประกาศเป็นข้อมูลอ้างอิงและใช้
std :: อ้างอิง () ที่จะผ่านมัน):
doSomething โมฆะ (ถ่าน C, const shared_futureและฉ)
f1 รถยนต์ = async (เปิดตัว :: async, doSomething, std :: อ้างอิง (ฉ '.'));
ตอนนี้แทนการใช้ในอนาคตที่ใช้ร่วมกันหลายวัตถุทั้งหมดที่ใช้ร่วมกันรัฐเดียวกันคุณต้องการใช้อย่างใดอย่างหนึ่ง
ที่ใช้ร่วมกัน วัตถุในอนาคตที่จะดำเนินการได้รับหลาย () 's (หนึ่งในแต่ละหัวข้อ) แต่วิธีนี้มี
ความเสี่ยงมากขึ้น เป็นโปรแกรมเมอร์ที่คุณต้องให้แน่ใจว่าอายุการใช้งานของ f (ใช่ฉ, รัฐไม่ได้ใช้ร่วมกัน
มันหมายถึง) ไม่ได้มีขนาดเล็กกว่าสำหรับหัวข้อเริ่มต้น นอกจากนี้ทราบว่าฟังก์ชั่นสมาชิกของ
ฟิวเจอร์สที่ใช้ร่วมกันไม่ได้ประสานกับตัวเองแม้ว่ารัฐที่ใช้ร่วมกันที่ใช้ร่วมกันจะตรง
ดังนั้นถ้าคุณทำมากขึ้นกว่าเพียงแค่การอ่านข้อมูลที่คุณอาจจำเป็นต้องใช้เทคนิคการประสานภายนอก (ดูมาตรา
18.4, หน้า 982) เพื่อหลีกเลี่ยงการแข่งขันข้อมูลซึ่งจะส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด หรือเป็นอเรนซ์
Crowl หนึ่งในผู้เขียนของห้องสมุดพร้อมกันเขียนไว้ในการสื่อสารส่วนตัว: "ถ้ารหัส
อยู่ที่การประสานงานแน่นผ่านโดยการอ้างอิงจะปรับ ถ้ารหัสเผยแพร่อาจเป็นภูมิภาคที่มี
ความเข้าใจที่ไม่สมบูรณ์ของวัตถุประสงค์และข้อ จำกัด ในการผ่านโดยค่าจะดีกว่า การคัดลอก
ในอนาคตที่ใช้ร่วมกันมีราคาแพง แต่ไม่แพงเพื่อที่จะแสดงให้เห็นถึงข้อผิดพลาดที่แฝงอยู่ในระบบขนาดใหญ่ ".
สำหรับรายละเอียดเพิ่มเติมของ shared_future ชั้นดูส่วน 18.3.3, หน้า 976
www.it-ebooks.info
964 บทที่ 18: Concurrency
18.2 การเชื่อมต่อระดับต่ำ-: กระทู้และสัญญา
นอกจากนี้อินเตอร์เฟซระดับสูงของ async () และ (ใช้ร่วมกัน) ฟิวเจอร์ส C + + ห้องสมุดมาตรฐานให้
อินเตอร์เฟซในระดับต่ำที่จะเริ่มกระทู้และจัดการกับพวกเขา
18.2.1 มาตรฐานประเภท: : ด้าย
ด้ายในการเริ่มต้นคุณก็ต้องประกาศวัตถุของมาตรฐานชั้น :: ด้ายและผ่านที่ต้องการ
งานที่เป็นอาร์กิวเมนต์เริ่มต้นและแล้วทั้งรอสิ้นหรือถอดมัน
doSomething โมฆะ ();
std :: ด้ายที (doSomething) / / เริ่มต้น doSomething () ในพื้นหลัง
...
t.join () / / รอทีให้เสร็จ (บล็อกจน doSomething () สิ้นสุด)
สำหรับ async () คุณสามารถส่งผ่านสิ่งที่เป็น callable วัตถุ (ฟังก์ชั่นการทำงานของสมาชิกฟังก์ชัน
วัตถุแลมบ์ดา; ดูหัวข้อ 4.4, หน้า 54) ร่วมกับข้อโต้แย้งที่เป็นไปได้เพิ่มเติม แต่
ทราบอีกครั้งว่าถ้าคุณไม่ทราบจริงๆสิ่งที่คุณกำลังทำคุณควรจะผ่านวัตถุทั้งหมดที่จำเป็นในการ
ประมวลผลการทำงานที่ผ่านค่าด้ายเพื่อให้ใช้เพียงสำเนาท้องถิ่น (ดูมาตรา 18.4,
หน้า 982, สำหรับบางส่วนของปัญหาที่อาจจะ เกิดขึ้นเป็นอย่างอื่น)
นอกจากนี้เป็นอินเตอร์เฟซในระดับต่ำดังนั้นสิ่งที่น่าสนใจคือสิ่งที่อินเตอร์เฟซนี้จะไม่
ให้เมื่อเทียบกับ async () (ดูมาตรา 18.1, หน้า 946):
•ด้ายชั้นไม่ได้มีการเปิดตัวนโยบาย . C + + ห้องสมุดมาตรฐานมักจะพยายามที่จะเริ่มต้น
การทำงานที่ผ่านมาในหัวข้อใหม่ ถ้าเป็นไปไม่ได้ที่มันจะพ่น std :: system_error (ดู
มาตรา 4.3.1, หน้า 43) ด้วย resource_unavailable_try_again รหัสข้อผิดพลาด (ดูมาตรา
4.3.2, หน้า 45)
•คุณมีอินเตอร์เฟซที่ไม่มีผลในการประมวลผลหรือ ผลของด้าย สิ่งเดียวที่คุณจะได้รับ
คือรหัสกระทู้ที่ไม่ซ้ำกัน (ดูมาตรา 18.2.1, หน้า 967)
•หากเกิดข้อยกเว้นที่ไม่ได้ติดอยู่ภายในด้ายโปรแกรมที่ถูกยกเลิกทันทีเรียก
std :: ยุติ () (ดูมาตรา 5.8.2, หน้า 162) ที่จะผ่านข้อยกเว้นกับบริบทภายนอก
exception_ptrs ด้าย (ดูมาตรา 4.3.3, หน้า 52) จะต้องถูกนำมาใช้
•คุณต้องประกาศว่าเป็นโทร, คุณต้องการที่จะรอปลายด้าย (โทร
เข้าร่วม ( )) หรือแยกออกจากด้ายเริ่มที่จะปล่อยให้มันทำงานในพื้นหลังโดยไม่มีการควบคุมใด ๆ
(เรียกแยก ()) ถ้าคุณไม่ทำเช่นนี้ก่อนที่จะอายุของวัตถุด้ายสิ้นสุดลงหรือย้าย
มอบหมายให้มันเกิดขึ้นโปรแกรมถูกยกเลิกเรียก std :: ยุติ () (ดูมาตรา 5.8.2,
หน้า 162)
•หากคุณปล่อยให้ ใช้ด้ายในพื้นหลังและหลัก () สิ้นสุดลงหัวข้อทั้งหมดจะถูกยกเลิกทันที
นี่คือตัวอย่างที่สมบูรณ์เป็นครั้งแรก:
/ / concurrency/thread1.cpp
# include
# include
www.it-ebooks.info
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 3:[สำเนา]
คัดลอก!
และระดับอินเตอร์เฟซ : async() และฟิวเจอร์ส 961
}
กลับน้ำ ;
}
เป็นโมฆะ dosomething ( อักขระ C shared_future < int > F )

ลอง { {
/ / รอจำนวนตัวอักษรที่จะพิมพ์
int num = F . get() ; / / ได้ผล querynumber()
( int ผม = 0 ; i < Num ; I ) {
this_thread : : sleep_for ( Chrono : : มิลลิวินาที ( 100 ) ;
เคาท์ ใส่ ( C ) flush() ;
}
}
จับ ( Const ข้อยกเว้น& E ) {
cerr < < " ข้อยกเว้นในหัวข้อ " < < this_thread :: get_id()
< < " : " < < < < . what() Endl ;
}
{

}
1 main() ลอง {
/ / เริ่มหัวข้อที่จะค้นหาหมายเลข
shared_future < int > F = การ ( querynumber ) ;
/ / เริ่มสามหัวข้อแต่ละการประมวลผลตัวเลขนี้ในห่วง
รถ F1 = การ ( เปิดตัว : : การ dosomething , ' ' F ) ;
Auto F2 = การ ( เปิดตัว : : การ dosomething , ' ' F ) ;
รถ F3 = การ ( เปิดตัว : : การ dosomething , ' * ' f ;
/ / รอทั้งหมด ลูปเสร็จ
1 . get() get() ;
;
F2 F3 . get() ;
}
จับ ( Const ข้อยกเว้น& E ) {
" nexception เคาท์ < < " < < < < . what() Endl } ;

เคาท์ < < " ทำ " < < Endl ;
}

www.it-ebooks ข้อมูลผม บทที่ 18 : การ
ในตัวอย่างนี้ หัวข้อหนึ่งที่เรียก querynumber() แบบสอบถามเป็นค่าหนึ่งซึ่งถูกใช้โดย
กระทู้อื่นไปแล้ว แสดงงานนี้ ผลของ std : : async() ซึ่งเริ่มต้น
สอบถามด้ายได้รับมอบหมายให้ shared_future วัตถุเฉพาะเพื่อคืนค่า :
shared_future < int > F = การ ( querynumber ) ;
ดังนั้น ในอนาคตที่ใช้ร่วมกันสามารถเริ่มต้นด้วยอนาคตธรรมดา ซึ่งย้ายสถานะจาก
ในอนาคตร่วมกันในอนาคต สามารถใช้ Auto สำหรับปฏิญญานี้ คุณ สามารถ หรือใช้ฟังก์ชัน :

share() สมาชิกอัตโนมัติ F = การ ( querynumber ) share() ;
ภายในทั้งหมดที่ใช้ร่วมกันวัตถุที่ใช้ร่วมกันในอนาคตรัฐ ซึ่ง async() สร้างเพื่อเก็บผล
ของผ่านการทํางาน ( และร้านการทํางานเอง ถ้ามันเป็นจริง )
ร่วมกันในอนาคต แล้วส่งผ่านไปยังหัวข้ออื่น ๆ เริ่มต้นด้วยที่แบ่งปัน
dosomething() ในอนาคตเป็นอาร์กิวเมนต์ที่สอง :
รถยนต์ F1 = การ ( เปิดตัว : : การ dosomething , ' ' F ) ;
Auto F2 = การ ( เปิดตัว : : การ dosomething , ' ' ,F ) ;
รถ F3 = การ ( เปิดตัว : : การ dosomething , ' * ' f ;
ข้างในแต่ละสายของ dosomething() เรารอ กระบวนการ และผลของ querynumber() เรียก
get() สำหรับใช้ในอนาคตผ่าน :
เป็นโมฆะ dosomething ( อักขระ C shared_future < int > F )
{

ลอง { int num = F . get() ; / / ได้ผล querynumber()
.
}
จับ ( Const ข้อยกเว้น& E ) {
cerr < < " ข้อยกเว้นในหัวข้อ " < < this_thread : : get_id()
< "" < < < < . what() Endl } } ;


ถ้า querynumber() โยนข้อยกเว้น ซึ่งถ้าไม่รวมค่าสามารถอ่านแต่ละ
เรียก dosomething() จะได้รับข้อยกเว้นนี้ด้วย . get() ดังนั้นการจัดการข้อยกเว้น

ที่จะเกิดขึ้น ดังนั้นหลังจากการอ่านค่า 5 เป็นอินพุต การแสดงผลอาจจะอ่านหมายเลข :
5
* . * . * * . *

แต่ถ้าพิมพ์เสร็จ ' X ' เป็น input output อาจจะ :
อ่านหมายเลข : X
ยกเว้นในหัวข้อที่ 3 : ไม่มีหมายเลขอ่าน
ยกเว้นในหัวข้อที่ 4 : หมายเลขไม่อ่าน
ยกเว้นในหัวข้อที่ 2 : หมายเลขไม่อ่าน


ทำ www.it-ebooks ข้อมูลและระดับอินเตอร์เฟซ : async() และฟิวเจอร์ส 963
หมายเหตุว่า สั่งด้ายผลผลิตและบัตรค่า Sin ( ดูส่วน 18.2.1
หน้า , 967 , สำหรับรายละเอียดเกี่ยวกับด้าย
รหัส )นอกจากนี้ยังทราบว่ามีความแตกต่างเล็กน้อยในการประกาศ get() ระหว่างอนาคตและ shared_future :
-
เรียนในอนาคต < > , get() ไว้ดังนี้ ( ไม่ได้เป็นชนิดของส่งกลับค่า ) :
t อนาคต < t > : : get() ; / / ทั่วไป get()
T < T &&ในอนาคต > : : get() ; ความเชี่ยวชาญ / / สำหรับการอ้างอิงในอนาคต <
เป็นโมฆะเป็นโมฆะ > : : get() ; ความเชี่ยวชาญ / /
เป็นโมฆะซึ่งรูปแบบแรกจะย้ายหรือคัดลอกผลของผล .
- เรียน shared_future < > , get() ไว้ดังนี้ Const T
& shared_future < t > : : get() ; / / ทั่วไป get()
t & shared_future < t & > : : get() ; ความเชี่ยวชาญ / / อ้างอิง
โมฆะ shared_future < ช่องว่าง > : : get() ; ความเชี่ยวชาญ / /
เป็นโมฆะซึ่งรูปแบบแรกจะคืนค่าอ้างอิงผลค่าเก็บไว้ในที่ใช้ร่วมกันใช้ร่วมกันของรัฐ หรือเป็น n3194
, [ : ( ] อเมริกา :
" เดียวใช้เป็นค่า get() ย้ายที่ดีที่สุด ( เช่น std : : เวกเตอร์ < int > V = F . get() ) . . . . . . .
get() Const อ้างอิงคือการเข้าถึงที่เหมาะสม ( เช่น int i = F . get() [ 3 ] ) .
ออกแบบนี้แนะนำความเสี่ยงของชีวิต หรือ ประเด็นการแข่งขันข้อมูลถ้าส่งกลับค่าแก้ไข ( ดู
ส่วน 18.3.3 หน้า 977 , สำหรับรายละเอียด ) .
คุณยังสามารถผ่านอนาคตร่วมกันโดยอ้างอิง ( คือประกาศไว้เป็นข้อมูลอ้างอิงและใช้
std : : ref() ผ่าน ) :
เป็นโมฆะ dosomething ( อักขระ C , Const shared_future < int > & F )
รถยนต์ F1 = การ ( เปิดตัว : : การ dosomething , ' , ' , std : : Ref ( F ) ;
ตอนนี้แทนการใช้ร่วมกันในอนาคตหลายวัตถุร่วมกันใช้ร่วมกันทั้งหมด รัฐ คุณต้องใช้หนึ่ง
ที่ใช้ร่วมกันวัตถุในอนาคตเพื่อแสดงหลาย get() ( หนึ่งในแต่ละหัวข้อ ) อย่างไรก็ตาม วิธีการนี้คือ
มีความเสี่ยงมากขึ้น เป็นโปรแกรมเมอร์ คุณมีเพื่อให้แน่ใจว่าการใช้งานของ F ( ใช่ , F , ไม่ใช้สภาพ
มันหมายถึง ) ไม่ได้เป็นขนาดเล็กกว่าสำหรับหัวข้อที่เริ่มต้น นอกจากนี้ โปรดทราบว่าสมาชิกหน้าที่ของ
ร่วมกันล่วงหน้าไม่ตรงกันกับตัวเองที่ใช้ร่วมกันใช้ร่วมกันแม้ว่ารัฐจะตรงกัน
ดังนั้นถ้าคุณทำมากกว่าแค่อ่านข้อมูล คุณอาจต้องการเทคนิคประสานภายนอก ( ดูมาตรา
18.4 , หน้า 982 ) เพื่อหลีกเลี่ยงการแข่งข้อมูล ซึ่งจะส่งผลให้พฤติกรรม undefined . หรือเป็นลอเรนซ์
crowl หนึ่งในผู้เขียนของการห้องสมุดเขียนในการสื่อสารส่วนบุคคล : " ถ้ารหัส
ยังคงประสานกันแน่นผ่านโดยอ้างอิงก็ได้ ถ้ารหัสอาจแพร่กระจายในภูมิภาค
ความเข้าใจไม่สมบูรณ์ของวัตถุประสงค์และข้อ จำกัด โดยผ่านค่าดีกว่า คัดลอก
ร่วมกันในอนาคตจะแพง แต่ราคาไม่แพงเท่ากับว่าแมลงแฝงในระบบขนาดใหญ่ . "
สำหรับรายละเอียดเพิ่มเติมของรุ่น shared_future ดูส่วน 18.3.3 , หน้า 1 .
www.it-ebooks ข้อมูล
964 บทที่ 18 : การ
182 ระดับอินเตอร์เฟซ : หัวข้อและสัญญา
นอกจากระดับสูงและอินเตอร์เฟซของ async() ( ร่วมกัน ) ฟิวเจอร์ส , มาตรฐานห้องสมุดมีอินเตอร์เฟซระดับล่างเพื่อเริ่มหัวข้อ

และจัดการกับพวกเขา 18.2.1 ห้อง STD : : ด้าย
เริ่มเธรด คุณเพียงแค่ต้องประกาศเป็นวัตถุของคลาส std : : ด้ายและผ่านที่ต้องการ
งานเป็นครั้งแรกการโต้แย้งแล้วรอจุดจบหรือถอดออก : dosomething()
โมฆะ ;
std : : ด้าย T ( dosomething ) ; / / เริ่ม dosomething() ในพื้นหลัง

. . . . . . . . join() ; / / รอไม่เสร็จ ( dosomething() บล็อกจนจบ )
สำหรับ async() , คุณสามารถผ่านสิ่งที่เป็นวัตถุ คง ( ฟังก์ชันสมาชิกฟังก์ชัน ฟังก์ชัน
วัตถุ แลมด้า ดูมาตรา 4.4 หน้า 54 ) ร่วมกับอาร์กิวเมนต์เพิ่มเติมเป็นไปได้อย่างไรก็ตาม
หมายเหตุอีกครั้งจนกว่าคุณจะรู้ว่าจริงๆสิ่งที่คุณกำลังทำ คุณควรผ่านวัตถุทั้งหมดที่จำเป็นเพื่อ
กระบวนการผ่านการทํางานด้วยค่าเพื่อให้ด้ายใช้สำเนาท้องถิ่นเท่านั้น ( ดูในส่วนค่าบริการ
หน้า , 982 , บางส่วนของปัญหาที่อาจจะเกิดขึ้น มิฉะนั้น )
นอกจากนี้ นี้เป็น อินเตอร์เฟซระดับต่ำ ดังนั้น สิ่งที่น่าสนใจคือว่าอินเทอร์เฟสนี้ไม่ได้
ให้เทียบกับ async() ( ดูมาตรา 18.1 , หน้า 946 ) :
- คลาส ด้ายไม่มีนโยบายเปิด ห้องสมุด C มาตรฐานมักจะพยายามที่จะเริ่มต้น
ผ่านการทํางานในกระทู้ใหม่ ถ้ามันเป็นไปไม่ได้ มันพ่น std : : system_error ( ดู
ส่วนใน , หน้า 43 ) กับรหัสข้อผิดพลาด resource_unavailable_try_again ( ดูส่วน

4.3.2 , หน้า 45 )- คุณไม่มีการเชื่อมต่อกับกระบวนการผลหรือผลลัพธ์ของด้าย สิ่งเดียวที่คุณจะได้รับคือหัวข้อเฉพาะ ID
( ดูมาตรา 18.2.1 , หน้า 122 ) .
- ถ้าเป็นข้อยกเว้นที่เกิดขึ้นนั้นไม่ได้ถูกจับในหัวข้อ โปรแกรมถูกยกเลิกทันที โทร
std : : terminate() ( ดูมาตรา 5.8.2 , หน้า 162 ) ผ่านข้อยกเว้นบริบทภายนอก
ด้าย exception_ptrs ส่วน 4.3.3 ( ดู ,หน้า 52 ) ต้องใช้
- คุณต้องประกาศว่า เป็น สาย คุณต้องรอสิ้นเดือนด้าย ( เรียก
join() ) หรือแยกออกจากกระทู้เริ่มต้นให้มันทำงานในพื้นหลังโดยไม่มีการควบคุม
( เรียก detach() ) ถ้าคุณไม่ทำก่อนอายุการใช้งานของด้ายวัตถุสิ้นสุดหรือย้าย
มอบหมายให้มันเกิดขึ้น , โปรแกรมยกเลิกเรียก std : :terminate() ( ดูมาตรา 5.8.2

, หน้า 162 ) - ถ้าคุณให้ด้ายรันในพื้นหลังและ main() จบ หัวข้อทั้งหมดจะถูกยกเลิกทันที .
ที่นี่เป็นครั้งแรกที่สมบูรณ์ตัวอย่าง :
/ / /
#พร้อมกัน thread1 . cpp < หัวข้อ >
#รวมรวม < เวลา >
www.it-ebooks ข้อมูล
การแปล กรุณารอสักครู่..
 
ภาษาอื่น ๆ
การสนับสนุนเครื่องมือแปลภาษา: กรีก, กันนาดา, กาลิเชียน, คลิงออน, คอร์สิกา, คาซัค, คาตาลัน, คินยารวันดา, คีร์กิซ, คุชราต, จอร์เจีย, จีน, จีนดั้งเดิม, ชวา, ชิเชวา, ซามัว, ซีบัวโน, ซุนดา, ซูลู, ญี่ปุ่น, ดัตช์, ตรวจหาภาษา, ตุรกี, ทมิฬ, ทาจิก, ทาทาร์, นอร์เวย์, บอสเนีย, บัลแกเรีย, บาสก์, ปัญจาป, ฝรั่งเศส, พาชตู, ฟริเชียน, ฟินแลนด์, ฟิลิปปินส์, ภาษาอินโดนีเซี, มองโกเลีย, มัลทีส, มาซีโดเนีย, มาราฐี, มาลากาซี, มาลายาลัม, มาเลย์, ม้ง, ยิดดิช, ยูเครน, รัสเซีย, ละติน, ลักเซมเบิร์ก, ลัตเวีย, ลาว, ลิทัวเนีย, สวาฮิลี, สวีเดน, สิงหล, สินธี, สเปน, สโลวัก, สโลวีเนีย, อังกฤษ, อัมฮาริก, อาร์เซอร์ไบจัน, อาร์เมเนีย, อาหรับ, อิกโบ, อิตาลี, อุยกูร์, อุสเบกิสถาน, อูรดู, ฮังการี, ฮัวซา, ฮาวาย, ฮินดี, ฮีบรู, เกลิกสกอต, เกาหลี, เขมร, เคิร์ด, เช็ก, เซอร์เบียน, เซโซโท, เดนมาร์ก, เตลูกู, เติร์กเมน, เนปาล, เบงกอล, เบลารุส, เปอร์เซีย, เมารี, เมียนมา (พม่า), เยอรมัน, เวลส์, เวียดนาม, เอสเปอแรนโต, เอสโทเนีย, เฮติครีโอล, แอฟริกา, แอลเบเนีย, โคซา, โครเอเชีย, โชนา, โซมาลี, โปรตุเกส, โปแลนด์, โยรูบา, โรมาเนีย, โอเดีย (โอริยา), ไทย, ไอซ์แลนด์, ไอร์แลนด์, การแปลภาษา.

Copyright ©2025 I Love Translation. All reserved.

E-mail: