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

คำถามที่เกี่ยวข้องหลายเธรดรวมถึงเทคนิคโครงสร้างและปัญหาด้านความปลอดภัย

7
มีวิธีปฏิบัติที่เลิกใช้แล้วสำหรับการเขียนโปรแกรมมัลติเธรดและมัลติโปรเซสเซอร์ซึ่งฉันไม่ควรใช้อีกต่อไปหรือไม่?
ในวันแรก ๆ ของ FORTRAN และ BASIC โปรแกรมทั้งหมดถูกเขียนด้วยคำสั่ง GOTO ผลลัพธ์คือโค้ดสปาเก็ตตี้และวิธีแก้ปัญหาคือการเขียนโปรแกรมแบบมีโครงสร้าง ตัวชี้อาจมีลักษณะควบคุมได้ยากในโปรแกรมของเรา C ++ เริ่มต้นด้วยตัวชี้มากมาย แต่แนะนำให้ใช้การอ้างอิง ไลบรารี่อย่าง STL สามารถลดการพึ่งพาของเราได้บ้าง นอกจากนี้ยังมีสำนวนในการสร้างสมาร์ทพอยน์เตอร์ที่มีคุณสมบัติดีกว่าและ C ++ บางรุ่นจะอนุญาตให้อ้างอิงและจัดการโค้ด วิธีปฏิบัติในการเขียนโปรแกรมเช่นการสืบทอดและ polymorphism ใช้ตัวชี้จำนวนมากเบื้องหลัง ภาษาเช่น Java กำจัดพอยน์เตอร์และใช้การรวบรวมขยะเพื่อจัดการข้อมูลที่จัดสรรแบบไดนามิกแทนที่จะขึ้นอยู่กับโปรแกรมเมอร์เพื่อจับคู่คำสั่งใหม่และลบทั้งหมด ในการอ่านของฉันฉันได้เห็นตัวอย่างของการเขียนโปรแกรมแบบหลายกระบวนการและหลายเธรดที่ดูเหมือนจะไม่ใช้เซมาฟอร์ พวกเขาใช้สิ่งเดียวกันกับชื่อที่แตกต่างกันหรือพวกเขามีวิธีการใหม่ในการจัดโครงสร้างการปกป้องทรัพยากรจากการใช้งานพร้อมกันหรือไม่? ตัวอย่างเช่นตัวอย่างเฉพาะของระบบสำหรับการเขียนโปรแกรมมัลติเธรดที่มีตัวประมวลผลมัลติคอร์คือ OpenMP มันแสดงให้เห็นถึงภูมิภาคที่สำคัญดังต่อไปนี้โดยไม่ต้องใช้เซมาฟอร์ซึ่งดูเหมือนจะไม่รวมอยู่ในสภาพแวดล้อม th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; …

2
ใครสามารถอธิบายอย่างง่าย ๆ ว่าอะไรคือรูปแบบของตัวทำลาย
ฉันต้องการถ้าคุณสามารถอธิบายให้ฉันในวิธีที่ง่ายวิธี disatteror ทำงานอย่างไร แนวคิดนี้ทำให้ฉันเข้าใจยาก บางทีด้วยความช่วยเหลือของคุณฉันสามารถเข้าใจมัน

3
ทำไมไม่ Green Threads
ในขณะที่ฉันรู้ว่าคำถามนี้ได้รับการครอบคลุมแล้ว (เช่นhttps://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ) ฉันไม่รู้สึกว่าฉันได้รับคำตอบที่น่าพอใจ . คำถามคือ: ทำไม JVM ไม่สนับสนุนเธรดสีเขียวอีกต่อไป? มันบอกว่านี้ในแบบโค้ด Java คำถามที่พบบ่อย : เธรดสีเขียวหมายถึงโหมดการทำงานของ Java Virtual Machine (JVM) ซึ่งโค้ดทั้งหมดจะถูกดำเนินการในเธรดระบบปฏิบัติการเดียว และสิ่งนี้จบบนjava.sun.com : ข้อเสียคือการใช้เธรดสีเขียวหมายถึงเธรดระบบบน Linux ไม่ได้รับประโยชน์และดังนั้นเครื่องเสมือน Java จึงไม่สามารถปรับขนาดได้เมื่อเพิ่มซีพียูเพิ่มเติม สำหรับฉันแล้วดูเหมือนว่า JVM อาจมีกระบวนการของระบบเท่ากับจำนวนแกนประมวลผลจากนั้นจึงรันเธรดสีเขียวที่ด้านบนของนั้น สิ่งนี้อาจมีข้อได้เปรียบที่ยิ่งใหญ่เมื่อคุณมีเธรดจำนวนมากซึ่งบล็อกบ่อยครั้ง (ส่วนใหญ่เป็นเพราะจำนวนสูงสุดของเธรด JVM ในปัจจุบัน) คิด?

6
คุณจะฝึกพ้องความพร้อมและมัลติเธรดอย่างไร [ปิด]
ฉันได้อ่านเกี่ยวกับการทำงานพร้อมกันหลายเธรดและวิธีการ"อาหารกลางวันฟรีมีมากกว่า" แต่ฉันยังไม่มีโอกาสที่จะใช้ MT ในงานของฉัน ฉันกำลังมองหาคำแนะนำเกี่ยวกับสิ่งที่ฉันสามารถทำได้เพื่อฝึกฝน CPU หนัก ๆ MT ผ่านการฝึกหัดหรือการมีส่วนร่วมในโครงการโอเพนซอร์สบางแห่ง ขอบคุณ แก้ไข: ฉันสนใจโครงการโอเพ่นซอร์สที่ใช้ MT สำหรับงานที่ผูกกับ CPU หรืออัลกอริทึมที่น่าสนใจในการใช้งาน MT แทนที่จะเป็นหนังสือหรือเอกสารที่อธิบายเครื่องมือเช่นเธรด mutex และล็อกเท่านั้น วิธีใช้ MT เพื่อให้มี GUI ที่ตอบสนองต่อ ...

3
GCC กำลังจะตายโดยไม่มีเธรดรองรับบน Windows หรือไม่ [ปิด]
ฉันต้องการความคิดเห็น GCC เป็นคอมไพเลอร์ที่ดีอยู่เสมอ ฉันเพิ่งพบว่าบน Windows GCC ไม่มีstd::threadการสนับสนุนบังคับให้ผู้ใช้ Windows ใช้คอมไพเลอร์อื่นเพราะคุณสมบัติที่น่าตื่นเต้นที่สุดยังคงหายไป แต่ทำไม GCC ถึงยังไม่มีการรองรับเธรดใน Windows ปัญหาใบอนุญาต? ABI เข้ากันไม่ได้? (มีห้องสมุดข้ามแพลตฟอร์มหลายแห่งที่ใช้มัลติเธรด: บูสต์, POCO, SDL, wxwidgets เป็นต้นมันไม่ง่ายเลยที่จะใช้ที่มีอยู่แล้วและ MIT / libpng ที่ได้รับอนุญาตรหัสเพื่อให้พอดีกับหลุมนี้แทนที่จะส่ง GCC ไม่มีการสนับสนุนเธรด?) เมื่อเร็ว ๆ นี้เมื่อดูการเปรียบเทียบคอมไพเลอร์ GCC มีการรองรับคุณสมบัติ C ++ 11 ที่กว้างที่สุดในส่วนที่เกี่ยวกับคอมไพเลอร์อื่น ๆ ยกเว้นความจริงที่ว่าใน Windows นี้ไม่เป็นความจริงเพราะเรายังขาดอะตอมมิก mutexes และเธรด: ฉันต้องการทราบเพิ่มเติมเกี่ยวกับหัวข้อนี้ แต่สิ่งเดียวที่ฉันสามารถหาได้คือคนที่ขอความช่วยเหลือเพราะ: "thread" ไม่มีอยู่ใน std namespace ดูการติดตามตั๋วและการสนทนาทางไปรษณีย์ของ …

8
เมื่อใดที่คุณจะต้องใช้ "กระทู้นับแสน"
Erlang, Go และ Rust อ้างสิทธิ์ทั้งหมดไม่ทางใดก็ทางหนึ่งซึ่งสนับสนุนการเขียนโปรแกรมพร้อมกันด้วย "threads" / coroutines ราคาถูก ไปคำถามที่พบบ่อยฯ : เป็นจริงในการสร้าง goroutines หลายแสนในพื้นที่ที่อยู่เดียวกัน The Rust Tutorialพูดว่า: เนื่องจากงานมีราคาถูกกว่าอย่างมากในการสร้างกว่าเธรดดั้งเดิม Rust สามารถสร้างงานพร้อมกันนับแสนในระบบ 32 บิตโดยทั่วไป เอกสารของ Erlangกล่าวว่า: ขนาดฮีพเริ่มต้นเริ่มต้นที่ 233 คำนั้นค่อนข้างอนุรักษ์นิยมเพื่อสนับสนุนระบบ Erlang ที่มีกระบวนการหลายแสนหรือหลายล้านกระบวนการ คำถามของฉัน: แอปพลิเคชั่นประเภทใดที่ต้องการเธรดการทำงานพร้อมกันจำนวนมาก? มีเพียงเว็บเซิร์ฟเวอร์ที่ยุ่งที่สุดเท่านั้นที่จะได้รับผู้เยี่ยมชมหลายพันคนพร้อมกัน แอปพลิเคชั่นประเภทบอส - คนงาน / การส่งงานที่ฉันเขียน Hit ลดลงส่งคืนเมื่อจำนวนเธรด / กระบวนการมากกว่าจำนวนแกนประมวลผลทางกายภาพมาก ฉันคิดว่ามันสมเหตุสมผลสำหรับแอปพลิเคชั่นตัวเลข แต่ในความเป็นจริงคนส่วนใหญ่มอบหมายให้ขนานกับไลบรารีของบุคคลที่สามที่เขียนใน Fortran / C / C ++ ไม่ใช่ภาษารุ่นใหม่กว่านี้

2
คำอธิบายของ Wakeups ปลอม ๆ ดูเหมือนเป็นข้อผิดพลาดที่ไม่คุ้มค่ากับการแก้ไขใช่ไหม?
จากบทความของ Wikipedia เกี่ยวกับSpurious Wakeups "เธรดอาจถูกปลุกจากสถานะรอแม้ว่าจะไม่มีเธรดที่ส่งสัญญาณตัวแปรเงื่อนไข" ในขณะที่ฉันรู้เกี่ยวกับ 'ฟีเจอร์' นี้ฉันไม่เคยรู้ว่าเกิดอะไรขึ้นจริง ๆ ในบทความเดียวกัน "การตื่นขึ้นโดยลวงตาอาจฟังดูแปลก แต่ในระบบมัลติโปรเซสเซอร์บางตัวการทำให้การเรียกใช้เงื่อนไขสามารถคาดการณ์ได้อย่างสมบูรณ์อาจทำให้การทำงานของตัวแปรเงื่อนไขช้าลงอย่างมาก" ดูเหมือนว่าเป็นข้อบกพร่องที่ไม่คุ้มค่ากับการแก้ไขใช่ไหม

11
เต็มไปด้วยข้อบกพร่องแบบมัลติเธรด
ในทีมใหม่ของฉันที่ฉันจัดการรหัสส่วนใหญ่ของเราคือแพลตฟอร์มซ็อกเก็ต TCP และรหัสเครือข่าย http C ++ ทั้งหมด ส่วนใหญ่มาจากผู้พัฒนารายอื่นที่ออกจากทีมไป นักพัฒนาปัจจุบันของทีมนั้นฉลาดมาก แต่ส่วนใหญ่เป็นรุ่นรองในแง่ของประสบการณ์ ปัญหาที่ใหญ่ที่สุดของเรา: ข้อบกพร่องที่เกิดขึ้นพร้อมกันแบบมัลติเธรด ไลบรารีคลาสของเราส่วนใหญ่เขียนเป็นแบบอะซิงโครนัสโดยใช้คลาสเธรดพูลบางคลาส เมธอดบนไลบรารีคลาสมักเข้าคิวเพื่อรัน taks ที่ยาวบนเธรดพูลจากเธรดหนึ่งและจากนั้นเมธอดการเรียกกลับของคลาสนั้นจะถูกเรียกใช้บนเธรดอื่น เป็นผลให้เรามีข้อบกพร่องกรณีขอบจำนวนมากที่เกี่ยวข้องกับข้อสันนิษฐานเกลียวที่ไม่ถูกต้อง ซึ่งส่งผลให้ข้อบกพร่องที่ลึกซึ้งที่มีมากกว่าส่วนที่สำคัญและล็อคเพื่อป้องกันปัญหาการเกิดพร้อมกัน สิ่งที่ทำให้ปัญหาเหล่านี้ยากขึ้นคือความพยายามแก้ไขมักไม่ถูกต้อง ข้อผิดพลาดบางประการที่ฉันสังเกตเห็นว่าทีมพยายาม (หรือภายในรหัสเดิม) รวมถึงสิ่งต่อไปนี้: ข้อผิดพลาดทั่วไป # 1 - แก้ไขปัญหาการเกิดพร้อมกันโดยเพียงแค่ใส่ล็อกรอบ ๆ ข้อมูลที่ใช้ร่วมกัน แต่ลืมเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อวิธีการไม่ได้รับการเรียกในลำดับที่คาดหวัง นี่เป็นตัวอย่างง่ายๆ: void Foo::OnHttpRequestComplete(statuscode status) { m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } ดังนั้นตอนนี้เรามีข้อผิดพลาดที่สามารถเรียกปิดได้ในขณะที่ OnHttpNetworkRequestComplete กำลังเกิดขึ้น ผู้ทดสอบพบข้อผิดพลาดจับการถ่ายโอนข้อมูลความผิดพลาดและกำหนดข้อผิดพลาดให้กับนักพัฒนา เขาก็แก้ไขข้อผิดพลาดเช่นนี้ …

3
แผนภาพ UML ของแอปพลิเคชันแบบมัลติเธรด
สำหรับแอปพลิเคชันแบบเธรดเดียวฉันต้องการใช้คลาสไดอะแกรมเพื่อดูภาพรวมของสถาปัตยกรรมของแอปพลิเคชันนั้น ไดอะแกรมชนิดนี้ไม่ได้มีประโยชน์มากนักเมื่อพยายามทำความเข้าใจกับแอปพลิเคชั่นที่มีหลายเธรด / พร้อมกันอย่างหนักเช่นเนื่องจากอินสแตนซ์ต่าง ๆ ของคลาส "สด" บนเธรดที่แตกต่างกัน (หมายถึงการเข้าถึงอินสแตนซ์ ด้ายมันอาศัยอยู่) ดังนั้นความสัมพันธ์ระหว่างคลาสไม่จำเป็นต้องหมายความว่าฉันสามารถเรียกใช้เมธอดบนวัตถุเหล่านั้นได้ แต่ฉันต้องทำการเรียกใช้บนเธรดของวัตถุเป้าหมายแทน วรรณกรรมส่วนใหญ่ที่ฉันขุดขึ้นมาในหัวข้อต่างๆเช่นการออกแบบพร้อมกันกระจายและแอปพลิเคชันแบบเรียลไทม์กับ UMLโดย Hassan Gomaa มีความคิดที่ดีเช่นการวาดขอบเขตของเธรดลงในไดอะแกรมวัตถุ แต่โดยรวมแล้วดูเหมือนว่า มีประโยชน์จริงๆ ฉันไม่ต้องการใช้ไดอะแกรมเหล่านี้เป็นมุมมองระดับสูงของโดเมนปัญหา แต่เป็นการอธิบายรายละเอียดของคลาส / วัตถุการโต้ตอบและข้อ จำกัด เนื่องจากขอบเขตของเธรดที่กล่าวถึงข้างต้น ฉันอยากรู้ว่า: ไดอะแกรมชนิดใดที่คุณพบว่ามีประโยชน์มากที่สุดในการทำความเข้าใจแอปพลิเคชันแบบมัลติเธรด มีส่วนขยายใด ๆ กับ UML แบบคลาสสิกที่คำนึงถึงลักษณะเฉพาะของแอพพลิเคชั่นแบบมัลติเธรดเช่นผ่านคำอธิบายประกอบที่แสดงให้เห็นว่า วัตถุบางอย่างอาจอาศัยอยู่ในเธรดที่แน่นอนในขณะที่วัตถุอื่นไม่มีความสัมพันธ์ของเธรด บางฟิลด์ของวัตถุอาจถูกอ่านจากเธรดใดก็ได้ แต่เขียนไปจากอันเดียวเท่านั้น วิธีการบางอย่างจะซิงโครนัสและส่งคืนผลลัพธ์ในขณะที่วิธีอื่น ๆ แบบอะซิงโครนัสที่รับคำขอเข้าคิวและส่งคืนผลลัพธ์เช่นผ่านการติดต่อกลับบนเธรดอื่น

7
คุณมองหาอะไรเมื่อทำการดีบั๊กการหยุดชะงัก
เมื่อเร็ว ๆ นี้ฉันได้ทำงานในโครงการที่ใช้เธรดอย่างหนัก ฉันคิดว่าฉันโอเคที่จะออกแบบมัน ใช้การออกแบบที่ไร้รัฐมากที่สุดล็อคการเข้าถึงทรัพยากรทั้งหมดที่มีความต้องการมากกว่าหนึ่งเธรดและอื่น ๆ ประสบการณ์ของฉันในการเขียนโปรแกรมใช้งานได้ช่วยอย่างมาก อย่างไรก็ตามเมื่ออ่านรหัสด้ายของคนอื่นฉันสับสน ฉันกำลังดีบักการหยุดชะงักในขณะนี้และเนื่องจากรูปแบบการเข้ารหัสและการออกแบบแตกต่างจากลักษณะส่วนบุคคลของฉันฉันจึงมีช่วงเวลาที่ยากลำบากในการมองเห็นเงื่อนไขการหยุดชะงักที่อาจเกิดขึ้น คุณมองหาอะไรเมื่อทำการดีบั๊กการหยุดชะงัก

4
สิ่งที่ป้องกันไม่ให้สภาพการแข่งขันในการล็อค?
ฉันเข้าใจพื้นฐานของเผ่าพันธุ์ของข้อมูลและวิธีการล็อก / mutexes / semaphores ช่วยป้องกันพวกเขา แต่จะเกิดอะไรขึ้นถ้าคุณมี "สภาพการแข่งขัน" บนตัวล็อค? ยกตัวอย่างเช่นสองหัวข้อที่แตกต่างกันบางทีในโปรแกรมเดียวกัน แต่ทำงานบนหน่วยประมวลผลที่แตกต่างกันพยายามที่จะได้รับการล็อคในเวลาเดียวกันแน่นอน จะเกิดอะไรขึ้น? จะทำอย่างไรเพื่อป้องกันสิ่งนั้น มันเป็นไปไม่ได้หรือไม่น่าเป็นไปได้? หรือว่าเป็นสภาพการแข่งขันที่แท้จริงที่จะเกิดขึ้น?

10
เครื่องรัฐเทียบกับหัวข้อ
Alan Cox เคยกล่าวไว้ว่า "คอมพิวเตอร์เป็นเครื่องสถานะหัวข้อสำหรับผู้ที่ไม่สามารถตั้งโปรแกรมเครื่องสถานะ" เนื่องจากการถามอลันโดยตรงไม่ใช่ตัวเลือกสำหรับฉันที่ต่ำต้อยฉันจึงอยากถามที่นี่: วิธีใดที่ทำให้การทำงานแบบมัลติเธรดในภาษาระดับสูงเช่น Java โดยใช้เพียงหนึ่งเธรดและเครื่องสถานะ ตัวอย่างเช่นจะเกิดอะไรขึ้นถ้ามี 2 กิจกรรมที่ต้องดำเนินการ (ทำการคำนวณและทำ I / O) และกิจกรรมหนึ่งสามารถบล็อกได้ ใช้ "เครื่องรัฐเท่านั้น" ทางเลือกที่ทำงานได้กับหลายเธรดในภาษาระดับสูง?

6
มัลติเธรด: ฉันทำผิดหรือเปล่า?
ฉันกำลังทำงานกับแอพพลิเคชั่นที่เล่นดนตรี ในระหว่างการเล่นบ่อยครั้งสิ่งต่าง ๆ ต้องเกิดขึ้นในเธรดแยกต่างหากเนื่องจากพวกเขาต้องเกิดขึ้นพร้อมกัน ตัวอย่างเช่นบันทึกของคอร์ดจำเป็นต้องได้ยินร่วมกันดังนั้นแต่ละคนจึงได้รับมอบหมายให้เล่นเธรดของตัวเอง (แก้ไขเพื่อชี้แจง: การโทรnote.play()ค้างเธรดจนกว่าโน้ตจะเล่นเสร็จและนี่คือเหตุผลที่ฉันต้องการสาม แยกเธรดเพื่อให้สามารถได้ยินโน้ตสามโน้ตพร้อมกัน) พฤติกรรมแบบนี้จะสร้างเธรดจำนวนมากในระหว่างการเล่นเพลง ตัวอย่างเช่นลองฟังเพลงที่มีท่วงทำนองสั้น ๆ และเพลงประกอบสั้น ๆ ท่วงทำนองทั้งหมดสามารถเล่นได้ในเธรดเดียว แต่ความก้าวหน้าต้องใช้สามเธรดเพื่อเล่นเนื่องจากแต่ละคอร์ดมีสามโน้ต ดังนั้นโค้ดหลอกสำหรับการเล่นโปรเกรสซีจึงเป็นดังนี้: void playProgression(Progression prog){ for(Chord chord : prog) for(Note note : chord) runOnNewThread( func(){ note.play(); } ); } ดังนั้นสมมติว่าความก้าวหน้ามี 4 คอร์ดและเราเล่นสองครั้งกว่าที่เราเปิด3 notes * 4 chords * 2 times= 24 เธรด และนี่เป็นเพียงการเล่นครั้งเดียว จริงๆแล้วมันใช้งานได้ดีในทางปฏิบัติ ฉันไม่เห็นความล่าช้าแฝงที่เห็นได้ชัดหรือข้อบกพร่องที่เกิดจากสิ่งนี้ แต่ฉันต้องการถามว่านี่เป็นการฝึกที่ถูกต้องหรือไม่หรือว่าฉันกำลังทำอะไรผิดปกติ มีเหตุผลหรือไม่ที่จะสร้างเธรดจำนวนมากในแต่ละครั้งที่ผู้ใช้กดปุ่ม? …

3
ทำไมมัลติเธรดถึงเป็นที่ต้องการสำหรับการปรับปรุงประสิทธิภาพ?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 6 ปีที่แล้ว ฉันมีคำถามเกี่ยวกับสาเหตุที่โปรแกรมเมอร์ดูเหมือนว่าจะรักการทำงานพร้อมกันและโปรแกรมแบบมัลติเธรดโดยทั่วไป ฉันกำลังพิจารณา 2 วิธีหลักที่นี่: โดยทั่วไปแล้ววิธีการแบบอะซิงก์นั้นขึ้นอยู่กับสัญญาณหรือเพียงแค่วิธีการแบบอะซิงก์ที่ถูกเรียกโดยเอกสารและภาษาจำนวนมากเช่น C # 5.0 ใหม่และ "ด้ายร่วม" ที่จัดการนโยบายการส่งข้อมูลของคุณ วิธีการทำงานพร้อมกันหรือวิธีการหลายเธรด ฉันแค่จะบอกว่าฉันกำลังคิดเกี่ยวกับฮาร์ดแวร์ที่นี่และสถานการณ์กรณีที่เลวร้ายที่สุดและฉันได้ทดสอบกระบวนทัศน์ทั้งสองนี้ด้วยตัวเองกระบวนทัศน์แบบ async เป็นผู้ชนะ ณ จุดที่ฉันไม่เข้าใจว่าทำไมคนถึง 90% พูดคุยเกี่ยวกับมัลติเธรดเมื่อพวกเขาต้องการเพิ่มความเร็วของสิ่งต่าง ๆ หรือใช้ทรัพยากรให้เกิดประโยชน์ ฉันได้ทดสอบโปรแกรมแบบมัลติเธรดและโปรแกรม async บนเครื่องเก่าด้วย Intel quad-core ที่ไม่ได้มีตัวควบคุมหน่วยความจำภายในซีพียูหน่วยความจำได้รับการจัดการทั้งหมดโดยเมนบอร์ดในกรณีนี้การแสดงที่น่ากลัวกับ แอ็พพลิเคชันแบบมัลติเธรดแม้จำนวนเธรดที่ค่อนข้างต่ำเช่น 3-4-5 อาจเป็นปัญหาแอ็พพลิเคชันไม่ตอบสนองและเป็นเพียงช้าและไม่เป็นที่พอใจ วิธี async ที่ดีคือในอีกทางหนึ่งอาจไม่เร็วขึ้น แต่ก็ไม่ได้แย่ที่สุดแอปพลิเคชันของฉันรอผลและไม่แฮงค์มันตอบสนองและมีการปรับขนาดที่ดีขึ้นมาก ฉันได้ค้นพบว่าการเปลี่ยนแปลงบริบทในโลกของเธรดนั้นไม่ได้ราคาถูกในสถานการณ์โลกแห่งความเป็นจริงมันค่อนข้างแพงโดยเฉพาะอย่างยิ่งเมื่อคุณมีเธรดมากกว่า 2 เธรดที่ต้องวนรอบและสลับระหว่างกันเพื่อคำนวณ ในซีพียูสมัยใหม่สถานการณ์มันไม่ได้แตกต่างกันจริงๆตัวควบคุมหน่วยความจำที่รวมเข้าด้วยกัน แต่ประเด็นของฉันคือซีพียู …

9
คำถามสัมภาษณ์การซิงโครไนซ์แบบมัลติเธรด: ค้นหาคำที่ได้รับจำนวน m เธรด
มีวิธีใดที่ปัญหานี้จะได้รับประโยชน์จากโซลูชันที่มีหลายเธรดแทนที่จะเป็นเธรดเดี่ยวหรือไม่? ในการสัมภาษณ์ฉันถูกขอให้แก้ปัญหาโดยใช้หลายกระทู้ สำหรับฉันแล้วดูเหมือนว่าหลายกระทู้จะไม่ให้ประโยชน์ นี่คือปัญหา: คุณจะได้รับย่อหน้าซึ่งมีจำนวนคำ n คุณจะได้รับหัวข้อเมตร สิ่งที่คุณต้องทำคือแต่ละเธรดควรพิมพ์หนึ่งคำและให้การควบคุมกับเธรดถัดไปด้วยวิธีนี้แต่ละเธรดจะทำการพิมพ์หนึ่งคำต่อไปในกรณีที่เธรดล่าสุดมาควรเรียกเธรดแรก การพิมพ์จะทำซ้ำจนกว่าคำทั้งหมดจะถูกพิมพ์ในวรรค ในที่สุดกระทู้ทั้งหมดควรออกอย่างสง่างาม การซิงโครไนซ์ชนิดใดที่จะใช้ ฉันรู้สึกว่าเราไม่สามารถใช้ประโยชน์จากเธรดที่นี่ได้ แต่เชื่อว่าผู้สัมภาษณ์พยายามวัดทักษะการซิงโครไนซ์ของฉัน ฉันขาดอะไรบางอย่างในปัญหานี้ที่ทำให้หลายกระทู้มีค่าหรือไม่ ไม่จำเป็นต้องใช้รหัสแค่ใส่ความคิด ฉันจะดำเนินการด้วยตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.