คำถามติดแท็ก multithreading

มัลติเธรดคือความสามารถของคอมพิวเตอร์หรือโปรแกรมในการทำงานพร้อมกันหรือแบบอะซิงโครนัสโดยใช้การประมวลผลหลายกระแสพร้อมกัน (โดยทั่วไปเรียกว่าเธรด)

1
การตอบสนองแบบดั้งเดิมนั้นรองรับเธรดมัลติเธรดและแบ็คกราวน์หรือการดำเนินการแบบขนานหรือไม่? เราจะทำสิ่งนั้นได้อย่างไร
ฉันได้อ่านเอกสารอย่างเป็นทางการของ react-native และแหล่งสื่อและบล็อกอื่น ๆ แล้วฉันรู้ว่ามีUI ThreadและJavaScript Threadใน react-native Javascript thread เป็นเธรดที่ลอจิกจะรันโค้ดจาวาสคริปต์จะทำการเรียก API การสัมผัสของเหตุการณ์จะถูกประมวลผลและอื่น ๆ อีกมากมาย และ UI Thread จะอัพเดต UI หากเธรด JavaScript กำลังทำงานในกระบวนการและหากเราดำเนินการกับปุ่มหรือเหตุการณ์การสัมผัสอื่น ๆ อีกครั้งจะต้องใช้เวลาในการตอบสนองหลังจากดำเนินการหนึ่งกระบวนการเพียงอัปเดต UI จนกว่าจะรู้สึกว่ามันล้าหลังหรือติดอยู่ที่ใดที่หนึ่ง ตัวอย่างเช่น มีตัวนำทางแท็บด้านล่างซึ่งมีสี่แท็บมี listview ในแท็บแรกและมุมมองแผนที่ซึ่งแสดงเส้นทางระหว่างหลายจุดในแท็บที่สอง ฉันได้ทำการกระทำของปุ่ม (คลิกเช่นเดียวกับปุ่มในมุมมองรายการ) ในแท็บแรกและไปที่แท็บที่สองในทันทีมันรู้สึกล่าช้าเล็กน้อยในการอัปเดต UI หรือใช้เวลาสักครู่ (1-3 วินาที) เพื่อนำทางจากครั้งแรก ไปที่แท็บที่สอง ในแท็บที่สองแผนที่ใช้เวลา (5-10 วินาที) เพื่อดึงเส้นทางระหว่างหลายจุดเมื่อกระบวนการนี้ดำเนินต่อไปหากฉันนำทางไปยังแท็บอื่น ๆ การนำทางระหว่างแท็บนั้นไม่ราบรื่นและ UI ล่าช้ามีจำนวนมาก เราจะทำให้แอปที่ตอบสนองต่อพื้นเมืองตอบสนองได้เร็วขึ้นต่อการกระทำที่สัมผัสได้และลดความล่าช้าของ UI …

2
Java หยุดบริการผู้ปฏิบัติการเมื่องานที่ได้รับมอบหมายอย่างใดอย่างหนึ่งของเขาล้มเหลวด้วยเหตุผลใด
ฉันต้องการบริการบางประเภทที่จะทำงานสองสามอย่างพร้อมกันและในช่วงเวลา 1 วินาทีเป็นเวลา 1 นาที หากงานใดงานหนึ่งล้มเหลวฉันต้องการหยุดบริการและงานทุกอย่างที่วิ่งไปพร้อมกับตัวบ่งชี้บางอย่างที่มีบางอย่างผิดปกติมิฉะนั้นหากหลังจากผ่านไปหนึ่งนาทีทุกอย่างไปได้ดีบริการจะหยุดทำงานโดยมีตัวบ่งชี้ว่า ตัวอย่างเช่นฉันมี 2 ฟังก์ชั่น: Runnable task1 = ()->{ int num = Math.rand(1,100); if (num < 5){ throw new Exception("something went wrong with this task,terminate"); } } Runnable task2 = ()->{ int num = Math.rand(1,100) return num < 50; } ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); task1schedule = …

3
“ ความผันผวน” รับประกันอะไรในรหัส C แบบพกพาสำหรับระบบมัลติคอร์หรือไม่?
หลังจากที่กำลังมองหาที่พวง ของ อื่น ๆ คำถาม และ พวกเขา ตอบฉันได้รับความประทับใจที่ไม่มีข้อตกลงอย่างกว้างขวางในสิ่งที่ "ผันผวน" คำหลักใน C หมายความว่า แม้มาตรฐานของตัวเองดูเหมือนจะไม่เพียงพอที่ชัดเจนสำหรับทุกคนที่จะเห็นด้วยกับสิ่งที่มันหมายถึง ท่ามกลางปัญหาอื่น ๆ : ดูเหมือนว่าจะให้การรับประกันที่แตกต่างกันขึ้นอยู่กับฮาร์ดแวร์ของคุณและขึ้นอยู่กับคอมไพเลอร์ของคุณ มันมีผลต่อการปรับให้เหมาะสมของคอมไพเลอร์ แต่ไม่ใช่การปรับให้เหมาะสมของฮาร์ดแวร์ดังนั้นในโปรเซสเซอร์ขั้นสูงที่ทำการปรับแต่งให้เหมาะสมนั้นไม่ชัดเจนว่าคอมไพเลอร์สามารถป้องกันการปรับให้เหมาะสมที่คุณต้องการป้องกันได้หรือไม่ (คอมไพเลอร์บางตัวสร้างคำแนะนำเพื่อป้องกันการปรับแต่งฮาร์ดแวร์บางอย่างในบางระบบ แต่สิ่งนี้ดูเหมือนจะไม่ได้มาตรฐานในทางใดทางหนึ่ง) เพื่อสรุปปัญหาปรากฏขึ้น (หลังจากอ่านมาก) ว่า "volatile" รับประกันสิ่งที่ต้องการ: ค่าจะอ่าน / เขียนไม่เพียงจาก / ไปยังการลงทะเบียน แต่อย่างน้อยกับแคช L1 หลักในลำดับเดียวกันกับที่ การอ่าน / เขียนจะปรากฏขึ้นในรหัส แต่สิ่งนี้ดูไร้ประโยชน์เนื่องจากการอ่าน / เขียนจาก / ไปยังการลงทะเบียนนั้นเพียงพอแล้วในเธรดเดียวกันในขณะที่การประสานงานกับแคช L1 ไม่รับประกันอะไรเพิ่มเติมเกี่ยวกับการประสานงานกับเธรดอื่น ๆ ฉันนึกภาพไม่ออกเลยว่ามันจะสำคัญเมื่อต้องซิงค์เพียงกับแคช L1 ใช้ 1 การใช้ …

1
เป็นไปได้หรือไม่ที่จะ จำกัด จำนวนเธรดสำหรับ C ++ 17 parallel `for_each`
ฉันใช้std::for_eachกับstd::execution::parเพื่อทำการคำนวณที่ซับซ้อนในการป้อนข้อมูลขนาดใหญ่ที่แสดงเป็นเวกเตอร์ของโครงสร้าง การคำนวณไม่ต้องการความล่าช้าใด ๆ ที่เกี่ยวข้องกับฮาร์ดแวร์ (เช่นเครือข่ายหรือดิสก์ IO) เป็นการคำนวณแบบ "just CPU" สำหรับฉันมันดูเหมือนว่าไม่มีเหตุผลที่จะสร้างเธรด OS เพิ่มเติมที่เรามีฮาร์ดแวร์ อย่างไรก็ตาม Visual C ++ 2019 จะสร้างเธรดโดยเฉลี่ย 50 เธรดและบางครั้งมากถึง 500 เธรดแม้ว่าจะมีเธรดฮาร์ดแวร์เพียง 12 เธรดเท่านั้น มีวิธี จำกัด เธรดแบบขนานที่นับhardware_concurrencyด้วยstd::for_eachและstd::execution::parหรือวิธีเดียวในการสร้างจำนวนเธรดที่สมเหตุสมผลคือการใช้โค้ดที่กำหนดเองด้วยstd::thread?

2
WebView พร้อมสำหรับ snapshot เมื่อใด ()
JavaFX เอกสารรัฐที่WebViewพร้อมเมื่อWorker.State.SUCCEEDEDถึงแต่ถ้าคุณรอในขณะที่ (เช่นAnimation, Transition, PauseTransitionฯลฯ ) หน้าว่างที่มีการแสดง สิ่งนี้ชี้ให้เห็นว่ามีเหตุการณ์ที่เกิดขึ้นภายใน WebView ที่พร้อมสำหรับการดักจับ แต่มันคืออะไร มีตัวอย่างโค้ดมากกว่า 7,000 รายการใน GitHub ที่ใช้SwingFXUtils.fromFXImageแต่ส่วนใหญ่ดูเหมือนว่าไม่เกี่ยวข้องกับWebViewมันเป็นแบบอินเทอร์แอคทีฟ (มาสก์มนุษย์ที่มีสภาพการแข่งขัน) หรือใช้การเปลี่ยนแปลงตามอำเภอใจ ฉันได้พยายาม: ฟังchanged(...)จากภายในส่วนWebViewข้อมูล ( DoublePropertyใช้คุณสมบัติความสูงและความกว้างObservableValueซึ่งสามารถตรวจสอบสิ่งเหล่านี้ได้) v ไม่สามารถทำงานได้ บางครั้งค่าดูเหมือนจะเปลี่ยนจากรูทีนการระบายสีซึ่งนำไปสู่เนื้อหาบางส่วน บอกอะไร ๆ ทุกอย่างไปrunLater(...)ที่ FX Application Thread techniques เทคนิคหลายอย่างใช้สิ่งนี้ แต่การทดสอบหน่วยของฉันเอง (เช่นเดียวกับข้อเสนอแนะที่ยอดเยี่ยมจากนักพัฒนาอื่น ๆ ) อธิบายว่าเหตุการณ์มักจะอยู่ในเธรดที่ถูกต้องและการโทรนี้ซ้ำซ้อน สิ่งที่ดีที่สุดที่ฉันสามารถนึกได้ก็คือการเพิ่มความล่าช้าเพียงพอผ่านการเข้าคิวที่ใช้งานได้สำหรับบางคน การเพิ่มผู้ฟัง / ทริกเกอร์ DOM หรือทริกเกอร์ / ทริกเกอร์ JavaScript ให้กับ WebView JavaScript …

1
แยกกระบวนการลูกวางไข่หลังจากเริ่มต้น
ฉันเริ่มต้นกระบวนการเลี้ยงลูกด้วยวิธีนี้: let process = spawn(apiPath, { detached: true }) process.unref() process.stdout.on('data', data => { /* do something */ }) เมื่อฉันเริ่มกระบวนการฉันต้องเก็บไว้เพราะฉันต้องการอ่านผลลัพธ์ แต่ก่อนที่จะปิดโปรเซส Node ของฉัน (แม่) ฉันต้องการแยกโพรเซสลูกที่ไม่เสร็จทั้งหมดเพื่อให้มันทำงานในแบ็คกราวน์ แต่ตามที่เอกสารอธิบาย : เมื่อใช้ตัวเลือกที่แยกออกเพื่อเริ่มกระบวนการที่ใช้เวลานานกระบวนการจะไม่ทำงานในพื้นหลังหลังจากที่ผู้ปกครองออกจากเว้นแต่ว่าจะมีการกำหนดค่า stdio ที่ไม่ได้เชื่อมต่อกับผู้ปกครอง แต่ด้วยตัวเลือกที่stdio: 'ignore'ฉันไม่สามารถอ่านstdoutซึ่งเป็นปัญหา ฉันพยายามปิดท่อด้วยตนเองก่อนที่จะปิดกระบวนการหลัก แต่ไม่สำเร็จ: // Trigger just before the main process end process.stdin.end() process.stderr.unpipe() process.stdout.unpipe()

5
วิธีสร้างหลายเธรดสำหรับแต่ละรายการที่ร้องขอ
ฉันพยายามประมวลผลโค้ดด้านล่างโดยใช้มัลติเธรดที่ระดับคำสั่งซื้อ List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); การดำเนินการตามลำดับปัจจุบัน: orders.stream().forEach(order -> { rules.forEach(rule -> { finalList.add(beanMapper.getBean(rule) .applyRule(createTemplate.apply(getMetaData.apply(rule), command), order)); }); }); ฉันได้ลองใช้: orders.parallelStream().forEach(order -> {}} // code snippet. แต่มันกำลังเปลี่ยนกฎสำหรับคำสั่งforEach (กฎ -> {}} ตัวอย่างเช่น: อินพุต: List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); List<String> rules = Arrays.asList("rule1", "rule2", "rule3"); ผลลัพธ์ที่คาดหวัง: …

1
“ เกิดขึ้นก่อนหน้านี้” หมายความว่าอะไร?
วลี "เกิดขึ้นอย่างแรงก่อน" ถูกใช้หลายครั้งในมาตรฐานฉบับร่าง C ++ ตัวอย่างเช่น: การยุติ [basic.start.term] / 5 หากความสมบูรณ์ของการเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่เกิดขึ้นก่อนที่จะเรียก std :: atexit (ดู, [support.start.term]) การเรียกฟังก์ชั่นผ่านไปยัง std :: atexit ถูกจัดลำดับก่อนการเรียกไปยัง destructor สำหรับวัตถุ ถ้าการเรียกไปยัง std :: atexit เกิดขึ้นอย่างมากก่อนที่การเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบสแตติกการเรียกไปยัง destructor สำหรับวัตถุนั้นจะถูกจัดลำดับก่อนที่การเรียกไปยังฟังก์ชันที่ส่งผ่านไปยัง std :: atexit . หากการเรียกไปยัง std :: atexit เกิดขึ้นอย่างยิ่งก่อนการเรียกไปยัง std :: atexit การเรียกใช้ฟังก์ชันที่ส่งไปยังการเรียก std :: atexit ที่สองจะถูกจัดลำดับก่อนการเรียกไปยังฟังก์ชันที่ส่งไปยัง first std :: …

3
ทำไม std :: atomic <T> :: is_lock_free () ไม่คงที่เช่นเดียวกับ constexpr
ใครสามารถบอกฉันว่า std :: atomic :: is_lock_free () ไม่คงที่เช่นเดียวกับ constexpr? มีมันไม่คงที่และ / หรือเป็น constexpr ไม่ได้ทำให้รู้สึกสำหรับฉัน

1
วิธีการโทรวิธีการเครื่องยนต์กระพือจากหัวข้ออื่น
ฉันใช้เดสก์ท็อปกระพือสำหรับลินุกซ์ ฉันกำลังเรียกวิธีที่เรียกMarkTextureFrameAvailableว่าควรจะทำเครื่องหมายพื้นผิวเพื่อให้เครื่องยนต์แสดงผลซ้ำ เนื่องจากฉันกำลังเขียนโปรแกรมเล่นวิดีโอฉันต้องโทรMarkTextureFrameAvailableจากเธรดของผู้เล่น ปัญหาคือเครื่องยนต์บังคับให้ฉันเรียกMarkTextureFrameAvailable(และวิธีการอื่น ๆ ของเครื่องยนต์) จากเธรดที่สร้างเครื่องยนต์ คุณจะเห็นว่าการเรียกไปยังเอ็นจิ้นทั้งหมดสิ้นสุดลงในเชลล์ซึ่งจะทำการตรวจสอบเพื่อดูว่ามีการโทรจากเธรดเดียวกันที่สร้างการโทรหรือไม่: task_runners_.GetPlatformTaskRunner()-&gt;RunsTasksOnCurrentThread() ( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 ) นี่คือวิธีที่ฉันสร้างเครื่องมือกระพือ: int main(int argc, char **argv) { //.. flutter::FlutterWindowController flutter_controller(icu_data_path); // Start the engine. if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path, arguments)) { return EXIT_FAILURE; } // Register any native plugins. FlutterWebRTCPluginRegisterWithRegistrar( flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin")); // Run until the window …

3
รายการ :: empty () พฤติกรรมแบบมัลติเธรด?
ฉันมีรายการที่ฉันต้องการให้เธรดต่าง ๆ หยิบองค์ประกอบ เพื่อหลีกเลี่ยงการล็อก mutex ที่ป้องกันรายการเมื่อว่างฉันempty()จะตรวจสอบก่อนล็อก ไม่เป็นไรหากการโทรไปlist::empty()ไม่ถูกต้อง 100% ของเวลา ฉันเพียงต้องการหลีกเลี่ยงการหยุดทำงานหรือรบกวนการทำงานพร้อมกันlist::push()และการlist::pop()โทร ฉันปลอดภัยempty()ไหมที่จะสมมติว่า VC ++ และ Gnu GCC บางครั้งจะผิดพลาดและไม่มีอะไรเลวร้ายไปกว่านี้ if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes mutex.lock(); if(list.empty() == false){ // check again while locked to be certain element = list.back(); list.pop_back(); } mutex.unlock(); }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.