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

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


4
AsyncTask เธรดไม่มีวันตาย
ฉันใช้AsyncTasks เพื่อดึงข้อมูลเพื่อตอบสนองต่อการที่ผู้ใช้กดปุ่ม สิ่งนี้ใช้งานได้ดีและช่วยให้อินเทอร์เฟซตอบสนองในขณะที่ดึงข้อมูล แต่เมื่อฉันตรวจสอบสิ่งที่เกิดขึ้นในดีบักเกอร์ Eclipse ฉันพบว่าทุกครั้งที่มีการสร้างใหม่AsyncTask(ซึ่งค่อนข้างบ่อยเพราะสามารถใช้ได้เพียงครั้งเดียว ) กำลังสร้างเธรดใหม่ แต่ไม่เคยยุติ ผลลัพธ์คือมีAsyncTaskเธรดจำนวนมากเพียงแค่นั่งอยู่ที่นั่น ฉันไม่แน่ใจว่านี่เป็นปัญหาในทางปฏิบัติหรือไม่ แต่ฉันอยากจะกำจัดเธรดพิเศษเหล่านั้นออกไป ฉันจะฆ่าเธรดเหล่านี้ได้อย่างไร

10
มีกรณีใดบ้างที่ควรใช้ออบเจ็กต์ Thread แบบเก่าแทนโครงสร้างที่ใหม่กว่าอย่างใดอย่างหนึ่ง
ฉันเห็นผู้คนมากมายในบล็อกโพสต์และที่นี่ใน SO ไม่ว่าจะหลีกเลี่ยงหรือให้คำแนะนำเกี่ยวกับการใช้งานThreadชั้นเรียนใน C # เวอร์ชันล่าสุด (และฉันหมายถึง 4.0+ แน่นอนด้วยการเพิ่มTask& friends) ก่อนหน้านี้มีการถกเถียงกันเกี่ยวกับความจริงที่ว่าการทำงานของเธรดเก่าธรรมดาสามารถถูกแทนที่ได้ในหลาย ๆ กรณีโดยThreadPoolคลาส นอกจากนี้กลไกพิเศษอื่น ๆ ยังทำให้Threadคลาสที่น่าสนใจน้อยลงเช่นการTimerเปลี่ยนคอมโบThread+ น่าเกลียดSleepในขณะที่สำหรับ GUI ที่เรามีBackgroundWorkerเป็นต้น ถึงกระนั้นThreadดูเหมือนว่าจะยังคงเป็นแนวคิดที่คุ้นเคยมากสำหรับบางคน (รวมถึงตัวฉันเองด้วย) คนที่เมื่อต้องเผชิญกับงานที่เกี่ยวข้องกับการดำเนินการแบบคู่ขนานบางอย่างให้ข้ามไปใช้Threadคลาสเก่าที่ดีโดยตรง เมื่อเร็ว ๆ นี้ฉันสงสัยว่าถึงเวลาที่จะต้องแก้ไขแนวทางของตัวเองแล้ว ดังนั้นคำถามของฉันคือมีกรณีใดบ้างที่จำเป็นหรือมีประโยชน์ที่จะใช้Threadวัตถุเก่าธรรมดาแทนโครงสร้างข้างต้นอย่างใดอย่างหนึ่ง
112 c#  .net  multithreading 

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

3
ทำไมวัตถุล็อคจึงต้องเป็นแบบคงที่?
เป็นเรื่องปกติมากที่จะใช้ออบเจ็กต์แบบอ่านอย่างเดียวแบบคงที่ส่วนตัวสำหรับการล็อกแบบมัลติเธรด ฉันเข้าใจว่าไพรเวตลดจุดเข้าสู่วัตถุล็อคโดยการทำให้การห่อหุ้มแน่นขึ้นและดังนั้นการเข้าถึงสิ่งที่สำคัญที่สุด แต่ทำไมคง? private static readonly object Locker = new object(); ในตอนท้ายฟิลด์จะใช้เฉพาะในชั้นเรียนของฉันเท่านั้นและฉันยังสามารถใช้สิ่งนี้แทน: private readonly object Locker = new object(); มีคำแนะนำอะไรมั้ย? อัพเดท: ตัวอย่างเช่นฉันได้วางโค้ดนี้ (เป็นเพียงตัวอย่าง) ฉันสามารถใช้ตู้เก็บของแบบคงที่หรือไม่คงที่กับสิ่งนี้และทั้งสองอย่างก็ใช้ได้ดี เมื่อพิจารณาคำตอบด้านล่างฉันควรจะกำหนดตู้เก็บของฉันแบบนี้ดีกว่าไหม? (ขออภัยฉันมีสัมภาษณ์สัปดาห์หน้าและต้องรู้ทุกรายละเอียด :) private readonly object Locker = new object(); และนี่คือรหัส: private int _priceA; private int _priceB; private EventWaitHandle[] _waithandle; private readonly IService _service; //ctor public …

5
แบ่งขนานไปข้างหน้า?
ฉันจะแยกออกจากเส้นขนานสำหรับลูปได้อย่างไร ฉันมีข้อความที่ค่อนข้างซับซ้อนซึ่งมีลักษณะดังต่อไปนี้: Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { Found = true; break; } })); การใช้คลาสคู่ขนานฉันสามารถเพิ่มประสิทธิภาพกระบวนการนี้ได้ อย่างไรก็ตาม; ฉันคิดไม่ออกว่าจะทำลายลูปขนานได้อย่างไร? break;คำสั่งพ่นไวยากรณ์ผิดพลาดต่อไปนี้: ไม่มีการปิดล้อมลูปที่จะทำลายหรือดำเนินการต่อ

11
การใช้ ThreadPool.QueueUserWorkItem ใน ASP.NET ในสถานการณ์ที่มีปริมาณการใช้งานสูง
ฉันรู้สึกประทับใจเสมอที่การใช้ ThreadPool สำหรับงานพื้นหลังระยะสั้น (สมมติว่าไม่สำคัญ) ถือเป็นแนวทางปฏิบัติที่ดีที่สุดแม้ใน ASP.NET แต่แล้วฉันก็เจอบทความนี้ซึ่งดูเหมือนจะแนะนำเป็นอย่างอื่น - อาร์กิวเมนต์คือคุณควรออกจาก ThreadPool เพื่อจัดการกับคำขอที่เกี่ยวข้องกับ ASP.NET นี่คือวิธีที่ฉันทำงานแบบอะซิงโครนัสขนาดเล็กจนถึงตอนนี้: ThreadPool.QueueUserWorkItem(s => PostLog(logEvent)) และบทความนี้แนะนำให้สร้างเธรดอย่างชัดเจนแทนโดยคล้ายกับ: new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start() วิธีแรกมีข้อได้เปรียบในการจัดการและกำหนดขอบเขต แต่มีความเป็นไปได้ (ถ้าบทความถูกต้อง) ว่างานเบื้องหลังจะแย่งเธรดด้วยตัวจัดการคำขอ ASP.NET วิธีที่สองทำให้ ThreadPool เป็นอิสระ แต่ต้องเสียค่าใช้จ่ายในการไม่ถูกผูกมัดและอาจใช้ทรัพยากรมากเกินไป คำถามของฉันคือคำแนะนำในบทความถูกต้องหรือไม่? หากไซต์ของคุณได้รับการเข้าชมมากจน ThreadPool ของคุณเริ่มเต็มแล้วจะเป็นการดีกว่าที่จะออกนอกวงหรือ ThreadPool แบบเต็มจะบ่งบอกว่าคุณกำลังใช้ทรัพยากรถึงขีด จำกัด อย่างไรก็ตามในกรณีนี้คุณ ไม่ควรพยายามเริ่มต้นกระทู้ของคุณเอง? คำชี้แจง: ฉันแค่ถามในขอบเขตของงานอะซิงโครนัสขนาดเล็กที่ไม่สำคัญ (เช่นการบันทึกจากระยะไกล) ไม่ใช่งานราคาแพงที่ต้องใช้กระบวนการแยกต่างหาก (ในกรณีนี้ฉันยอมรับว่าคุณจะต้องมีโซลูชันที่มีประสิทธิภาพมากขึ้น)

7
ข้อใดจะดีกว่าสำหรับงานพร้อมกันบน node.js เส้นใย? คนทำงานเว็บ? หรือเธรด?
ฉันสะดุดกับ node.js เมื่อหลายปีก่อนและชอบมันมาก แต่ในไม่ช้าฉันก็พบว่ามันขาดความสามารถในการทำงานที่ต้องใช้ CPU มาก ดังนั้นฉันจึงเริ่ม googling และได้รับคำตอบเหล่านี้เพื่อแก้ปัญหา: Fibers, Webworkers และ Threads (thread-a-gogo) ตอนนี้จะใช้อันไหนเป็นความสับสนและหนึ่งในนั้นจำเป็นต้องใช้อย่างแน่นอน - จุดประสงค์ของการมีเซิร์ฟเวอร์ที่ IO ดีแค่ไหนและไม่มีอย่างอื่น? คำแนะนำที่จำเป็น! อัพเดท: ฉันกำลังคิดหาวิธีที่ไม่สาย เพียงแค่ต้องการคำแนะนำมากกว่านั้น ตอนนี้สิ่งที่ฉันคิดคือ: มามีเธรดกันเถอะ (ใช้ thread_a_gogo หรืออาจจะเป็นเว็บเวิร์ค) ตอนนี้เมื่อเราต้องการมากขึ้นเราสามารถสร้างเพิ่มเติมได้ แต่จะมีข้อ จำกัด บางประการเกี่ยวกับกระบวนการสร้าง (ไม่ได้บอกเป็นนัยโดยระบบ แต่อาจเป็นเพราะค่าใช้จ่าย) ตอนนี้เมื่อเราเกินขีด จำกัด เราสามารถแยกโหนดใหม่และเริ่มสร้างเธรดทับได้ ด้วยวิธีนี้มันสามารถดำเนินต่อไปได้จนกว่าเราจะถึงขีด จำกัด (ในที่สุดกระบวนการก็มีค่าใช้จ่ายสูงเช่นกัน) เมื่อถึงขีด จำกัด นี้เราจะเริ่มจัดคิวงาน เมื่อใดก็ตามที่เธรดว่างจะมีการมอบหมายงานใหม่ วิธีนี้จะดำเนินต่อไปได้อย่างราบรื่น นั่นคือสิ่งที่ฉันคิด ความคิดนี้ดีหรือไม่? ฉันยังใหม่กับกระบวนการและเธรดทั้งหมดนี้ดังนั้นจึงไม่มีความเชี่ยวชาญใด ๆ กรุณาแบ่งปันความคิดเห็นของคุณ …

6
Thread.sleep ของ Java จะโยน InterruptedException เมื่อใด
Thread.sleep ของ Java จะโยน InterruptedException เมื่อใด ปลอดภัยที่จะเพิกเฉยหรือไม่? ฉันไม่ได้ทำมัลติเธรดใด ๆ ฉันต้องการรอสักครู่ก่อนที่จะลองดำเนินการอีกครั้ง

7
งบล็อคแพงแค่ไหน?
ฉันได้ทดลองกับการประมวลผลแบบหลายเธรดและการประมวลผลแบบขนานและฉันต้องการตัวนับเพื่อทำการนับพื้นฐานและการวิเคราะห์ทางสถิติเกี่ยวกับความเร็วของการประมวลผล เพื่อหลีกเลี่ยงปัญหาในการใช้คลาสของฉันพร้อมกันฉันได้ใช้คำสั่งล็อคกับตัวแปรส่วนตัวในคลาสของฉัน: private object mutex = new object(); public void Count(int amount) { lock(mutex) { done += amount; } } แต่ฉันสงสัยว่า ... การล็อคตัวแปรแพงแค่ไหน? ผลเสียต่อประสิทธิภาพคืออะไร?


5
นักแสดง Scala: รับและตอบสนอง
ขอบอกก่อนว่าฉันมีประสบการณ์ Java ค่อนข้างมาก แต่เพิ่งเริ่มสนใจภาษาที่ใช้งานได้ไม่นาน เมื่อเร็ว ๆ นี้ฉันได้เริ่มดู Scala ซึ่งดูเหมือนเป็นภาษาที่ดีมาก อย่างไรก็ตามฉันได้อ่านเกี่ยวกับกรอบนักแสดงของ Scala ในProgramming ใน Scalaและมีสิ่งหนึ่งที่ฉันไม่เข้าใจ ในบทที่ 30.4 กล่าวว่าการใช้reactแทนreceiveทำให้สามารถใช้เธรดซ้ำได้ซึ่งดีต่อประสิทธิภาพเนื่องจากเธรดมีราคาแพงใน JVM นี่หมายความว่าตราบใดที่ฉันจำได้ว่าต้องเรียกreactแทนreceiveฉันสามารถเริ่มนักแสดงมากเท่าที่ฉันชอบได้หรือไม่? ก่อนที่จะค้นพบ Scala ฉันเคยเล่นกับ Erlang และผู้เขียนProgramming Erlangภูมิใจนำเสนอเกี่ยวกับการวางไข่กว่า 200,000 กระบวนการโดยไม่ต้องเสียเหงื่อ ฉันไม่อยากทำแบบนั้นกับเธรด Java ฉันกำลังดูข้อ จำกัด ประเภทใดใน Scala เมื่อเทียบกับ Erlang (และ Java) นอกจากนี้เธรดนี้จะใช้ซ้ำใน Scala ได้อย่างไร สมมติเพื่อความง่ายผมมีด้ายเพียงเส้นเดียว นักแสดงทุกคนที่ฉันเริ่มทำงานตามลำดับในเธรดนี้หรือการสลับงานบางอย่างจะเกิดขึ้น? ตัวอย่างเช่นหากฉันเริ่มต้นนักแสดงสองคนที่ส่งข้อความปิงปองถึงกันฉันจะเสี่ยงต่อการชะงักงันหรือไม่หากพวกเขาเริ่มต้นด้วยเธรดเดียวกัน ตามที่การเขียนโปรแกรมใน Scalaเขียนนักแสดงที่จะใช้งานยากกว่าด้วยreact receiveฟังดูมีความเป็นไปได้เนื่องจากreactไม่กลับมา แต่หนังสือเล่มนี้ไปในการแสดงให้เห็นว่าคุณสามารถใส่ภายในห่วงใช้react Actor.loopเป็นผลให้คุณได้รับ loop { …




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