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

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

7
เรียกใช้ AsyncTasks หลาย ๆ ตัวในเวลาเดียวกัน - เป็นไปไม่ได้ใช่ไหม?
ฉันพยายามเรียกใช้ AsyncTasks สองรายการในเวลาเดียวกัน (แพลตฟอร์มคือ Android 1.5, HTC Hero) อย่างไรก็ตามมีเพียงคนแรกที่ถูกประหารชีวิต ต่อไปนี้เป็นตัวอย่างข้อมูลสั้น ๆ เพื่ออธิบายปัญหาของฉัน: public class AndroidJunk extends Activity { class PrinterTask extends AsyncTask<String, Void, Void> { protected Void doInBackground(String ... x) { while (true) { System.out.println(x[0]); try { Thread.sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); } } } }; @Override public …

10
ทำไมต้องรอ () อยู่ในบล็อกที่ซิงโครไนซ์เสมอ
เราทุกคนรู้ว่าเพื่อที่จะเรียกการเรียกObject.wait()นี้จะต้องอยู่ในบล็อกที่ทำข้อมูลให้ตรงกันมิฉะนั้นIllegalMonitorStateExceptionจะถูกโยน แต่อะไรคือสาเหตุที่ทำให้ข้อ จำกัด นี้คืออะไร? ฉันรู้ว่าการwait()เผยแพร่จอภาพ แต่ทำไมเราต้องได้รับจอภาพอย่างชัดเจนโดยการบล็อกการซิงโครไนซ์โดยเฉพาะแล้วปล่อยจอภาพโดยการโทรwait()? อะไรคือความเสียหายที่อาจเกิดขึ้นหากเป็นไปได้ที่จะเรียกใช้wait()นอกบล็อกที่ซิงโครไนซ์โดยรักษาความหมายไว้ - ระงับเธรดผู้โทร?

17
วิธีการหมดเวลาของเธรด
ฉันต้องการเรียกใช้เธรดในระยะเวลาที่แน่นอน หากยังไม่แล้วเสร็จภายในเวลานั้นฉันต้องการฆ่าทิ้งข้อยกเว้นหรือจัดการบางอย่าง จะทำอย่างไร? วิธีหนึ่งในการทำตามที่ฉันคิดออกจากหัวข้อนี้ คือการใช้ TimerTask ภายในเมธอด run () ของเธรด มีวิธีแก้ปัญหาที่ดีกว่านี้หรือไม่? แก้ไข: เพิ่มรางวัลตามที่ฉันต้องการคำตอบที่ชัดเจน รหัส ExecutorService ที่ระบุด้านล่างไม่สามารถแก้ไขปัญหาของฉันได้ ทำไมฉันถึงควรหลับ () หลังจากทำการประมวลผล (บางรหัส - ฉันไม่มีส่วนจัดการกับรหัสนี้) หากรหัสเสร็จสมบูรณ์และ sleep () ถูกขัดจังหวะจะเป็น timeOut ได้อย่างไร งานที่ต้องดำเนินการไม่ได้อยู่ในการควบคุมของฉัน มันอาจเป็นรหัสใด ๆ ปัญหาคือรหัสชิ้นส่วนนี้อาจทำงานเป็นวงวนไม่สิ้นสุด ฉันไม่ต้องการที่จะเกิดขึ้น ดังนั้นฉันแค่ต้องการที่จะทำงานในหัวข้อแยก เธรดหลักต้องรอจนกว่าเธรดนั้นจะเสร็จสิ้นและจำเป็นต้องทราบสถานะของงาน (เช่นไม่ว่าจะหมดเวลาหรือมีข้อยกเว้นเกิดขึ้นหรือประสบความสำเร็จ) หากงานเข้าสู่วงวนไม่สิ้นสุดเธรดหลักของฉันจะคอยเรื่อย ๆ ซึ่งไม่ใช่สถานการณ์ในอุดมคติ

10
วิธีการดีบักเธรดเดียวใน Visual Studio ได้อย่างไร
ฉันมีทางออกสำหรับบางโครงการ มีหลายจุดแตกต่างในโครงการที่แตกต่างกัน ฉันต้องการติดตามเธรดแรกที่ตีหนึ่งในจุดหยุดพักเหล่านี้และทำการติดตามเธรดเดี่ยวนั้นต่อไปแม้ว่าจะมีเธรดอื่น ๆ ที่ป้อนบล็อกโค้ดเดียวกัน ฉันรู้ว่าสิ่งนี้เป็นไปได้ด้วยการกำหนดเงื่อนไขในจุดพักนั่นคือ thread name = ... หรือ thread Id = ... แต่กรณีของฉันเป็นแอปพลิเคชันASP.NET ที่โหลดหนักและทันทีที่ฉันเชื่อมต่อกับw3wp.exeหลาย ๆ กระทู้จะตีจุดพัก ThreadLocal<break-point>ฉันต้องการบางสิ่งบางอย่างเช่น เป็นไปได้ไหม? ถ้าเป็นเช่นนั้นได้อย่างไร

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

3
ใช้กรณีสำหรับ RxJava schedulers
ใน RxJava มี5 ตัวเลือกที่แตกต่างกันให้เลือก: ทันที () : สร้างและส่งคืน Scheduler ที่ทำงานทันทีบนเธรดปัจจุบัน trampoline () : สร้างและส่งคืน Scheduler ที่จัดคิวงานบนเธรดปัจจุบันที่จะดำเนินการหลังจากงานปัจจุบันเสร็จสมบูรณ์ newThread () : สร้างและส่งคืน Scheduler ที่สร้างเธรดใหม่สำหรับแต่ละหน่วยงาน การคำนวณ () : สร้างและส่งคืน Scheduler สำหรับการคำนวณ สามารถใช้สำหรับการวนรอบเหตุการณ์การประมวลผลการเรียกกลับและงานคำนวณอื่น ๆ อย่าทำงานที่ถูกผูกไว้กับ IO บนตัวกำหนดตารางเวลานี้ ใช้ Schedulers io ()แทน io () : สร้างและส่งคืน Scheduler สำหรับงานที่มีขอบเขต IO การใช้งานได้รับการสนับสนุนโดยเธรดพู Executionor ที่จะเติบโตตามที่ต้องการ สามารถใช้สำหรับการบล็อก IO แบบอะซิงโครนัส …

10
คอนสตรัคเตอร์ C # คงที่ปลอดภัยหรือไม่?
กล่าวอีกนัยหนึ่งเธรดการใช้งานซิงเกิลนี้ปลอดภัยหรือไม่: public class Singleton { private static Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }


11
หากการรอคอยแบบ async ไม่ได้สร้างหัวข้อเพิ่มเติมใด ๆ แล้วจะทำให้แอปพลิเคชันตอบสนองได้อย่างไร
ครั้งแล้วครั้งเล่าฉันเห็นว่าการใช้async- awaitไม่ได้สร้างกระทู้เพิ่มเติม ไม่เป็นไรเพราะวิธีการเดียวที่คอมพิวเตอร์สามารถทำได้มากกว่า 1 อย่างในเวลาเดียวคือ จริง ๆ แล้วทำสิ่งต่าง ๆ มากกว่า 1 ครั้ง (ดำเนินการแบบขนานใช้หลายโปรเซสเซอร์) จำลองสถานการณ์โดยการกำหนดตารางงานและสลับไปมาระหว่างกัน (ทำ A เล็กน้อย, B เล็กน้อย, A เล็กน้อย, ฯลฯ ) ดังนั้นถ้าasync- awaitไม่ทำสิ่งเหล่านั้นมันจะทำให้แอปพลิเคชันตอบสนองได้อย่างไร หากมีเพียงเธรดเดียวเท่านั้นการเรียกใช้เมธอดใด ๆ หมายถึงการรอให้เมธอดดำเนินการให้เสร็จสิ้นก่อนที่จะทำสิ่งอื่นและวิธีการที่อยู่ภายในเมธอดนั้นต้องรอผลก่อนดำเนินการต่อไปเรื่อย ๆ

4
ความแตกต่างระหว่างโหลดเดอร์คลาสบริบทของเธรดและ classloader ปกติ
ความแตกต่างระหว่างตัวโหลดคลาสบริบทของเธรดและตัวโหลดคลาสปกติคืออะไร นั่นคือถ้าThread.currentThread().getContextClassLoader()และgetClass().getClassLoader()ส่งคืนคลาสโหลดเดอร์อ็อบเจ็กต์ที่แตกต่างกันอันใดจะถูกใช้?

7
Daemon เธรดคำอธิบาย
ในเอกสารประกอบของ Python มันบอกว่า: เธรดสามารถถูกแฟล็กเป็น "daemon thread" ความสำคัญของการตั้งค่าสถานะนี้คือโปรแกรม Python ทั้งหมดจะออกเมื่อเหลือเพียง daemon thread เท่านั้น ค่าเริ่มต้นจะสืบทอดมาจากการสร้างหัวข้อ ใครบ้างมีคำอธิบายที่ชัดเจนของสิ่งที่หมายถึงหรือตัวอย่างในทางปฏิบัติแสดงให้เห็นว่าคุณจะตั้งหัวข้อเป็นdaemonic? ชี้แจงให้ฉัน: ดังนั้นสถานการณ์เดียวที่คุณจะไม่ตั้งกระทู้เป็นdaemonicคือเมื่อคุณต้องการให้พวกเขาทำงานต่อไปหลังจากที่ออกจากหัวข้อหลัก?

15
เหตุการณ์ C # และความปลอดภัยของเธรด
UPDATE ตั้งแต่ C # 6 คำตอบสำหรับคำถามนี้คือ: SomeEvent?.Invoke(this, e); ฉันมักจะได้ยิน / อ่านคำแนะนำต่อไปนี้: ทำสำเนาของเหตุการณ์เสมอก่อนที่คุณจะตรวจสอบnullและดำเนินการ การทำเช่นนี้จะช่วยขจัดปัญหาที่อาจเกิดขึ้นกับเธรดที่เหตุการณ์เกิดขึ้นnullที่ตำแหน่งระหว่างที่คุณตรวจสอบว่ามีค่าว่างหรือไม่ // Copy the event delegate before checking/calling EventHandler copy = TheEvent; if (copy != null) copy(this, EventArgs.Empty); // Call any handlers on the copied list อัปเดต : ฉันคิดว่าจากการอ่านเกี่ยวกับการปรับให้เหมาะสมซึ่งสิ่งนี้อาจต้องการให้สมาชิกเหตุการณ์ระเหยได้ แต่ Jon Skeet ระบุไว้ในคำตอบของเขาว่า CLR ไม่ได้เพิ่มประสิทธิภาพการคัดลอก แต่ในขณะเดียวกันเพื่อให้ปัญหานี้เกิดขึ้นอีกเธรดอื่นต้องทำดังนี้: // Better …

11
“ เธรด” คืออะไร (จริง ๆ )?
ฉันได้รับการพยายามที่จะค้นหาความหมายที่ดีและได้รับความเข้าใจในสิ่งที่ด้ายจริงๆ ดูเหมือนว่าฉันจะต้องขาดอะไรบางอย่างที่เห็นได้ชัด แต่ทุกครั้งที่ฉันอ่านว่าเธรดคืออะไรมันเป็นคำจำกัดความแบบวงกลม la "a เธรดคือเธรดของการดำเนินการ" หรือ "วิธีการแบ่งงานที่กำลังดำเนินอยู่" เอ่อ ฮะ? ดูเหมือนว่าจากสิ่งที่ฉันได้อ่านว่าเธรดไม่ใช่สิ่งที่เป็นรูปธรรมจริงๆเช่นเดียวกับกระบวนการ ในความเป็นจริงมันเป็นเพียงแนวคิด จากสิ่งที่ฉันเข้าใจถึงวิธีการทำงานตัวประมวลผลประมวลผลคำสั่งบางอย่างสำหรับโปรแกรม (ซึ่งเรียกว่าเธรดการดำเนินการ ) จากนั้นเมื่อจำเป็นต้องสลับไปใช้การประมวลผลสำหรับโปรแกรมอื่นสำหรับบิตมันจะเก็บสถานะของ โปรแกรมที่กำลังเรียกใช้งานที่ใดที่หนึ่ง (Thread Local Storage) แล้วเริ่มดำเนินการตามคำแนะนำของโปรแกรมอื่น และกลับไปกลับมา เช่นนั้นเธรดเป็นเพียงแนวคิดสำหรับ "หนึ่งในเส้นทางของการดำเนินการ" ของโปรแกรมที่กำลังทำงานอยู่ แตกต่างจากกระบวนการซึ่งเป็นสิ่งที่จริง ๆ - มันคือการรวมกลุ่มของทรัพยากร ฯลฯ เป็นตัวอย่างของคำนิยามที่ไม่ได้ช่วยอะไรฉันมากนัก . . จากWikipedia : "เธรดในวิทยาการคอมพิวเตอร์นั้นสั้นสำหรับเธรดของการดำเนินการเธรดเป็นวิธีสำหรับโปรแกรมที่จะแบ่ง (เรียกว่า" แยก ") ตัวเองออกเป็นสองหรือมากกว่าพร้อมกันทำงาน (หรือหลอกพร้อมกัน) ทำงานหัวข้อและกระบวนการแตกต่าง ระบบปฏิบัติการไปยังอีกระบบหนึ่ง แต่โดยทั่วไปแล้วเธรดจะมีอยู่ภายในกระบวนการและเธรดที่แตกต่างกันในกระบวนการเดียวกันแบ่งปันทรัพยากรเดียวกันในขณะที่กระบวนการต่าง ๆ ในระบบปฏิบัติการมัลติทาสก์เดียวกันไม่ได้ " ดังนั้นฉันถูกไหม ไม่ถูกต้อง? เธรดคืออะไรจริง …

2
ความแตกต่างระหว่างการเขียนโปรแกรมแบบอะซิงโครนัสและมัลติเธรดคืออะไร?
ฉันคิดว่ามันเหมือนกัน - เขียนโปรแกรมที่แบ่งงานระหว่างโปรเซสเซอร์ (บนเครื่องที่มีโปรเซสเซอร์ 2+) จากนั้นฉันก็อ่านสิ่งนี้ซึ่งพูดว่า: วิธีการแบบอะซิงก์มีจุดประสงค์เพื่อให้ไม่มีการบล็อก นิพจน์ที่รออยู่ในเมธอด async จะไม่บล็อกเธรดปัจจุบันในขณะที่งานที่รออยู่กำลังทำงานอยู่ แต่นิพจน์จะลงทะเบียนส่วนที่เหลือของวิธีเป็นการต่อเนื่องและส่งกลับการควบคุมไปยังผู้โทรของวิธีการแบบอะซิงก์ คำหลักแบบ async และ waitit จะไม่ทำให้เกิดการสร้างเธรดเพิ่มเติม เมธอด Async ไม่ต้องการมัลติเธรดเนื่องจากเมธอด async ไม่ทำงานบนเธรดของตัวเอง วิธีการทำงานกับบริบทการซิงโครไนซ์ปัจจุบันและใช้เวลาในเธรดเฉพาะเมื่อวิธีการใช้งานอยู่ คุณสามารถใช้ Task.Run เพื่อย้ายงานที่เชื่อมโยงกับ CPU ไปยังเธรดพื้นหลังได้ แต่เธรดพื้นหลังไม่ได้ช่วยกระบวนการที่รอให้ผลลัพธ์พร้อมใช้งาน และฉันสงสัยว่ามีคนสามารถแปลเป็นภาษาอังกฤษให้ฉันได้หรือไม่ ดูเหมือนว่าจะแยกความแตกต่างระหว่าง asyncronicity (นั่นคือคำ?) และการทำเกลียวและบอกเป็นนัยว่าคุณสามารถมีโปรแกรมที่มีงานแบบอะซิงโครนัส แต่ไม่มีมัลติเธรด ตอนนี้ฉันเข้าใจความคิดของงานอะซิงโครนัสเช่นตัวอย่างใน pg 467 ของC #ของ Jon Skeet ในความลึก, รุ่นที่สาม async void DisplayWebsiteLength ( object sender, EventArgs …


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