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

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

3
บริบทจะเปลี่ยนช้าลงมากในเมล็ดลินุกซ์ใหม่
เรากำลังต้องการอัพเกรดระบบปฏิบัติการบนเซิร์ฟเวอร์ของเราจาก Ubuntu 10.04 LTS เป็น Ubuntu 12.04 LTS น่าเสียดายที่ดูเหมือนว่าเวลาในการตอบสนองในการรันเธรดที่รันได้นั้นเพิ่มขึ้นอย่างมีนัยสำคัญจาก 2.6 เคอร์เนลเป็น 3.2 เคอร์เนล ในความเป็นจริงตัวเลขเวลาแฝงที่เราได้รับนั้นยากที่จะเชื่อ ให้ฉันเจาะจงมากขึ้นเกี่ยวกับการทดสอบ เรามีโปรแกรมที่ทำงานสองเธรด เธรดแรกได้รับเวลาปัจจุบัน (ในเห็บโดยใช้ RDTSC) แล้วส่งสัญญาณตัวแปรเงื่อนไขวินาทีละครั้ง เธรดที่สองรอตัวแปรเงื่อนไขและตื่นขึ้นมาเมื่อมีการส่งสัญญาณ จากนั้นจะได้รับเวลาปัจจุบัน (ในเห็บโดยใช้ RDTSC) ความแตกต่างระหว่างเวลาในเธรดที่สองและเวลาในเธรดแรกจะถูกคำนวณและแสดงบนคอนโซล หลังจากนี้เธรดที่สองจะรอตัวแปรเงื่อนไขอีกครั้ง เธรดแรกจะส่งสัญญาณอีกครั้งหลังจากผ่านไปประมาณหนึ่งวินาที ดังนั้นโดยสรุปเราจะได้รับการสื่อสารแบบเธรดต่อเธรดผ่านการวัดเวลาแฝงตัวแปรเงื่อนไขหนึ่งวินาทีเป็นผล ในเคอร์เนล 2.6.32 เวลาแฝงนี้อยู่ที่ใดที่หนึ่งตามลำดับของ 2.8-3.5 us ซึ่งสมเหตุสมผล ในเคอร์เนล 3.2.0 เวลาแฝงนี้เพิ่มขึ้นเป็นที่ใดที่หนึ่งตามลำดับ 40-100 เรา ฉันได้ยกเว้นความแตกต่างใด ๆ ในฮาร์ดแวร์ระหว่างโฮสต์ทั้งสอง พวกเขาทำงานบนฮาร์ดแวร์ที่เหมือนกัน (โปรเซสเซอร์ซ็อกเก็ตคู่ X5687 {Westmere-EP} ที่ทำงานที่ 3.6 GHz พร้อมกับไฮเปอร์เธรดความเร็วขั้นตอนและสถานะ …

3
การเข้าถึง UI (Main) เธรดอย่างปลอดภัยใน WPF
ฉันมีแอปพลิเคชันที่อัปเดตดาต้ากริดของฉันทุกครั้งที่ไฟล์บันทึกที่ฉันกำลังดูได้รับการอัปเดต (ต่อท้ายด้วยข้อความใหม่) ในลักษณะต่อไปนี้: private void DGAddRow(string name, FunctionType ft) { ASCIIEncoding ascii = new ASCIIEncoding(); CommDGDataSource ds = new CommDGDataSource(); int position = 0; string[] data_split = ft.Data.Split(' '); foreach (AttributeType at in ft.Types) { if (at.IsAddress) { ds.Source = HexString2Ascii(data_split[position]); ds.Destination = HexString2Ascii(data_split[position+1]); break; } else { position += …

4
Python รองรับมัลติเธรดหรือไม่ สามารถเร่งเวลาดำเนินการได้หรือไม่?
ฉันสับสนเล็กน้อยว่ามัลติเธรดทำงานใน Python ได้หรือไม่ ฉันรู้ว่ามีคำถามมากมายเกี่ยวกับเรื่องนี้และฉันได้อ่านคำถามมากมาย แต่ฉันก็ยังสับสน ฉันรู้จากประสบการณ์ของตัวเองและเคยเห็นคนอื่น ๆ โพสต์คำตอบและตัวอย่างของพวกเขาเองที่ StackOverflow ว่าการทำมัลติเธรดเป็นไปได้ใน Python เหตุใดทุกคนจึงบอกว่า Python ถูกล็อกโดย GIL และเธรดเดียวเท่านั้นที่สามารถทำงานได้ในแต่ละครั้ง? มันทำงานได้อย่างชัดเจน หรือมีความแตกต่างบางอย่างที่ฉันไม่ได้มาที่นี่? ผู้โพสต์ / ผู้ตอบแบบสอบถามหลายคนมักพูดถึงว่าเธรดมี จำกัด เนื่องจากไม่ได้ใช้ประโยชน์จากหลายคอร์ แต่ฉันจะบอกว่ามันยังมีประโยชน์เพราะทำงานไปพร้อม ๆ กันจึงทำให้ปริมาณงานรวมเสร็จเร็วขึ้น ฉันหมายความว่าทำไมถึงมีโมดูลเธรด Python เป็นอย่างอื่น? อัปเดต: ขอบคุณสำหรับคำตอบทั้งหมดจนถึงตอนนี้ วิธีที่ฉันเข้าใจก็คือการทำงานแบบมัลติเธรดจะทำงานแบบขนานสำหรับงาน IO บางงานเท่านั้น แต่สามารถรันได้ทีละงานสำหรับงานหลักที่เชื่อมโยงกับ CPU เท่านั้น ฉันไม่แน่ใจว่าสิ่งนี้มีความหมายอย่างไรสำหรับฉันในแง่ที่ใช้ได้จริงดังนั้นฉันจะยกตัวอย่างประเภทของงานที่ฉันต้องการทำมัลติเธรด ตัวอย่างเช่นสมมติว่าฉันต้องการวนซ้ำรายการสตริงที่ยาวมากและฉันต้องการดำเนินการกับสตริงพื้นฐานในแต่ละรายการ ถ้าฉันแยกรายการออกให้ส่งแต่ละรายการย่อยเพื่อประมวลผลโดยรหัสลูป / สตริงของฉันในเธรดใหม่และส่งผลลัพธ์กลับในคิวปริมาณงานเหล่านี้จะทำงานโดยประมาณพร้อมกันหรือไม่ ที่สำคัญที่สุดในทางทฤษฎีจะเร่งเวลาในการรันสคริปต์หรือไม่? อีกตัวอย่างหนึ่งอาจเป็นถ้าฉันสามารถเรนเดอร์และบันทึกรูปภาพที่แตกต่างกันสี่ภาพโดยใช้ PIL ในสี่เธรดที่แตกต่างกันและนี่จะเร็วกว่าการประมวลผลภาพทีละภาพหรือไม่? ฉันเดาว่าส่วนประกอบความเร็วนี้เป็นสิ่งที่ฉันสงสัยจริงๆมากกว่าคำศัพท์ที่ถูกต้องคืออะไร ฉันยังรู้เกี่ยวกับโมดูลการประมวลผลหลายขั้นตอน แต่ความสนใจหลักของฉันในตอนนี้คือการโหลดงานขนาดเล็กถึงกลาง (10-30 …

3
FixedThreadPool vs CachedThreadPool: ความชั่วร้ายน้อยกว่าสองอย่าง
ฉันมีโปรแกรมที่สร้างเธรด (~ 5-150) ซึ่งทำงานได้หลายอย่าง ในขั้นต้นฉันใช้ a FixedThreadPoolเพราะคำถามที่คล้ายกันนี้แนะนำว่าเหมาะสำหรับงานที่มีชีวิตอยู่นานกว่าและด้วยความรู้ที่ จำกัด มากเกี่ยวกับมัลติเธรดฉันจึงคิดว่าอายุการใช้งานเฉลี่ยของเธรด (หลายนาที) " มีอายุยืนยาว " อย่างไรก็ตามฉันเพิ่งเพิ่มความสามารถในการสร้างเธรดเพิ่มเติมและการทำเช่นนั้นทำให้ฉันอยู่เหนือขีด จำกัด เธรดที่ฉันตั้งไว้ ในกรณีนี้จะดีกว่าไหมหากเดาและเพิ่มจำนวนเธรดที่ฉันอนุญาตหรือเปลี่ยนเป็นไฟล์CachedThreadPoolเธรดเพื่อให้ฉันไม่มีเธรดที่สูญเปล่า ลองใช้ทั้งคู่ในเบื้องต้นดูเหมือนจะไม่มีความแตกต่างดังนั้นฉันจึงมีแนวโน้มที่จะไปด้วยวิธีCachedThreadPoolเดียวที่จะหลีกเลี่ยงของเสีย อย่างไรก็ตามช่วงชีวิตของเธรดหมายความว่าฉันควรเลือกFixedThreadPoolและจัดการกับเธรดที่ไม่ได้ใช้แทนหรือไม่? คำถามนี้ทำให้ดูเหมือนว่าเธรดพิเศษเหล่านั้นจะไม่สูญเปล่า แต่ฉันขอขอบคุณสำหรับคำชี้แจง

5
จะรันงานพื้นหลังในเว็บแอปพลิเคชันที่ใช้ servlet ได้อย่างไร
ฉันใช้ Java และฉันต้องการให้ servlet ทำงานอย่างต่อเนื่องในแอปพลิเคชันของฉัน แต่ฉันไม่เข้าใจวิธีการทำ servlet ของฉันมีวิธีการที่ให้จำนวนผู้ใช้จากฐานข้อมูลในแต่ละวันรวมทั้งจำนวนผู้ใช้ทั้งหมดจากฐานข้อมูลทั้งหมด ดังนั้นฉันต้องการให้ servlet ทำงานอย่างต่อเนื่องเพื่อสิ่งนั้น

9
เหตุใด i ++ จึงไม่ใช่ปรมาณู
เหตุใดi++อะตอมจึงไม่อยู่ใน Java เพื่อให้ลึกลงไปอีกนิดใน Java ฉันพยายามนับความถี่ในการดำเนินการลูปในเธรด ดังนั้นฉันจึงใช้ไฟล์ private static int total = 0; ในคลาสหลัก ฉันมีสองกระทู้ หัวข้อ 1: พิมพ์ System.out.println("Hello from Thread 1!"); หัวข้อ 2: พิมพ์ System.out.println("Hello from Thread 2!"); และฉันนับบรรทัดที่พิมพ์ด้วยเธรด 1 และเธรด 2 แต่บรรทัดของเธรด 1 + บรรทัดของเธรด 2 ไม่ตรงกับจำนวนบรรทัดทั้งหมดที่พิมพ์ออกมา นี่คือรหัสของฉัน: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; public class Test …

11
java.lang.OutOfMemoryError: พื้นที่ฮีป Java
ฉันได้รับข้อผิดพลาดต่อไปนี้ในการเรียกใช้โปรแกรมมัลติเธรด java.lang.OutOfMemoryError: Java heap space ข้อผิดพลาดข้างต้นเกิดขึ้นในหนึ่งในเธรด ถึงความรู้ของฉันพื้นที่ Heap ถูกครอบครองโดยตัวแปรอินสแตนซ์เท่านั้น หากถูกต้องเหตุใดจึงเกิดข้อผิดพลาดหลังจากทำงานได้ดีในบางครั้งเนื่องจากมีการจัดสรรพื้นที่สำหรับตัวแปรอินสแตนซ์ในขณะที่สร้างวัตถุ มีวิธีใดในการเพิ่มพื้นที่ฮีปหรือไม่? ฉันควรทำการเปลี่ยนแปลงอะไรกับโปรแกรมของฉันเพื่อที่จะใช้พื้นที่ฮีปน้อยลง

8
คืนค่าจากเธรด
ฉันมีวิธีการกับไฟล์HandlerThread. ค่าได้รับการเปลี่ยนแปลงภายในThreadและฉันต้องการส่งคืนกลับเป็นtest()วิธีการ มีวิธีทำไหม? public void test() { Thread uiThread = new HandlerThread("UIHandler"){ public synchronized void run(){ int value; value = 2; //To be returned to test() } }; uiThread.start(); }

4
iphone ios ทำงานในเธรดแยกต่างหาก
วิธีที่ดีที่สุดในการรันโค้ดบนเธรดแยกคืออะไร ใช่ไหม: [NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL]; หรือ: NSOperationQueue *queue = [NSOperationQueue new]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doStuff:) object:nil; [queue addOperation:operation]; [operation release]; [queue release]; ฉันทำวิธีที่สองแล้ว แต่ Wesley Cookbook ที่ฉันเคยอ่านใช้แบบแรก

7
สัญญาณ - การใช้การนับเริ่มต้นคืออะไร?
http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx ในการสร้างเซมาฟอร์ฉันต้องระบุจำนวนเริ่มต้นและจำนวนสูงสุด MSDN ระบุว่าการนับเริ่มต้นคือ - จำนวนคำขอเริ่มต้นสำหรับเซมาฟอร์ที่สามารถให้ได้พร้อมกัน แม้ว่าจะระบุว่าจำนวนสูงสุดคือ จำนวนคำขอสูงสุดสำหรับเซมาฟอร์ที่สามารถให้ได้พร้อมกัน ฉันเข้าใจว่าจำนวนสูงสุดคือจำนวนเธรดสูงสุดที่สามารถเข้าถึงทรัพยากรพร้อมกันได้ แต่การใช้การนับเริ่มต้นคืออะไร? ถ้าฉันสร้างเซมาฟอร์โดยมีจำนวนเริ่มต้นเป็น 0 และจำนวนสูงสุดเป็น 2 เธรดพูลเธรดของฉันจะไม่สามารถเข้าถึงทรัพยากรได้ ถ้าฉันตั้งค่าการนับเริ่มต้นเป็น 1 และจำนวนสูงสุดเป็น 2 เธรดพูลเธรดเท่านั้นที่สามารถเข้าถึงทรัพยากรได้ เฉพาะเมื่อฉันตั้งค่าการนับเริ่มต้นและจำนวนสูงสุดเป็น 2 เธรด 2 เธรดเท่านั้นที่สามารถเข้าถึงทรัพยากรได้พร้อมกัน ดังนั้นฉันจึงสับสนจริงๆเกี่ยวกับความสำคัญของการนับเริ่มต้น? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at …

3
เธรด Android AsyncTask จำกัด ไหม
ฉันกำลังพัฒนาแอปพลิเคชันที่ฉันต้องอัปเดตข้อมูลทุกครั้งที่ผู้ใช้เข้าสู่ระบบฉันยังใช้ฐานข้อมูลในโทรศัพท์ด้วย สำหรับการดำเนินการทั้งหมด (การอัปเดตการดึงข้อมูลจากฐานข้อมูลและอื่น ๆ ) ฉันใช้งาน async จนถึงตอนนี้ฉันไม่เห็นว่าทำไมฉันไม่ควรใช้มัน แต่เมื่อเร็ว ๆ นี้ฉันพบว่าถ้าฉันดำเนินการบางอย่างงาน async ของฉันเพียงแค่หยุดดำเนินการล่วงหน้าและอย่าข้ามไปที่ doInBackground มันแปลกเกินไปที่จะปล่อยไว้แบบนั้นดังนั้นฉันจึงพัฒนาแอปพลิเคชั่นง่ายๆอีกตัวเพื่อตรวจสอบว่ามีอะไรผิดปกติ และแปลกพอฉันได้รับพฤติกรรมเดียวกันเมื่อจำนวนงาน async ทั้งหมดถึง 5 งานที่ 6 หยุดการดำเนินการล่วงหน้า Android มีการ จำกัด asyncTasks ใน Activity / App หรือไม่? หรือเป็นเพียงข้อผิดพลาดบางอย่างและควรรายงาน? มีใครประสบปัญหาเดียวกันและอาจพบวิธีแก้ปัญหาหรือไม่? นี่คือรหัส: เพียงสร้าง 5 เธรดเหล่านี้เพื่อทำงานในเบื้องหลัง: private class LongAsync extends AsyncTask<String, Void, String> { @Override protected void onPreExecute() { …

12
CoreData: คำเตือน: ไม่สามารถโหลดคลาสที่ชื่อ
ฉันกำลังทำซ้ำแอพ Objective-C TV Show ที่มีอยู่กับ Swift เวอร์ชันใหม่โดยใช้ Xcode 6.1 และกำลังมีปัญหากับ CoreData ฉันได้สร้างแบบจำลองของ 4 เอนทิตีสร้างคลาสย่อย NSManagedObject (ใน Swift) และไฟล์ทั้งหมดมีการกำหนดเป้าหมายแอปที่เหมาะสม (สำหรับ 'Compile Sources') ฉันยังคงได้รับข้อผิดพลาดนี้ทุกครั้งที่พยายามแทรกเอนทิตีใหม่: CoreData: คำเตือน: ไม่สามารถโหลดคลาสที่ชื่อ 'Shows' สำหรับเอนทิตี 'Shows' ไม่พบคลาสโดยใช้ NSManagedObject เริ่มต้นแทน ความคิดเห็นเล็กน้อย: เมื่อบันทึกเป็นข้อมูลหลักฉันใช้วิธีบริบทแม่ลูกเพื่ออนุญาตการทำเธรดพื้นหลัง ฉันทำได้โดยการตั้งค่า ManagedObjectContext โดยใช้: lazy var managedObjectContext: NSManagedObjectContext? = { // Returns the managed object context for the …

9
ExecutorService ที่ขัดขวางงานหลังจากหมดเวลา
ฉันกำลังมองหาการใช้งานExecutorServiceที่สามารถกำหนดระยะหมดเวลาได้ งานที่ส่งไปยัง ExecutorService ถูกขัดจังหวะหากใช้เวลานานกว่าการหมดเวลาในการรัน การใช้สัตว์ร้ายเช่นนี้ไม่ใช่เรื่องยาก แต่ฉันสงสัยว่าจะมีใครรู้ถึงการใช้งานที่มีอยู่หรือไม่ นี่คือสิ่งที่ฉันคิดขึ้นจากการสนทนาด้านล่าง มีคำแนะนำอะไรมั้ย? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, …

7
ตัวแปรคงที่ใช้ร่วมกันระหว่างเธรดหรือไม่
ครูของฉันในคลาส Java ระดับสูงเกี่ยวกับเธรดพูดบางอย่างที่ฉันไม่แน่ใจ เขาระบุว่าโค้ดต่อไปนี้ไม่จำเป็นต้องอัพเดตreadyตัวแปร ตามที่เขาพูดทั้งสองเธรดไม่จำเป็นต้องแชร์ตัวแปรคงที่โดยเฉพาะในกรณีที่แต่ละเธรด (เธรดหลักเทียบกับReaderThread) กำลังทำงานบนโปรเซสเซอร์ของตัวเองดังนั้นจึงไม่แชร์รีจิสเตอร์ / แคช / ฯลฯ เดียวกันและซีพียูตัวเดียว จะไม่อัปเดตอื่น ๆ โดยพื้นฐานแล้วเขากล่าวว่าเป็นไปได้ที่readyจะมีการอัปเดตในเธรดหลัก แต่ไม่ใช่ในเธรดReaderThreadดังนั้นสิ่งนั้นReaderThreadจะวนซ้ำไปเรื่อย ๆ นอกจากนี้เขายังอ้างว่าเป็นไปได้ที่โปรแกรมจะพิมพ์0หรือ42. ผมเข้าใจว่า42อาจจะมีการพิมพ์ 0แต่ไม่ เขากล่าวถึงกรณีนี้เมื่อnumberตัวแปรถูกตั้งค่าเป็นค่าเริ่มต้น ฉันคิดว่าบางทีไม่สามารถรับประกันได้ว่าตัวแปรคงที่ถูกอัพเดตระหว่างเธรด แต่สิ่งนี้ทำให้ฉันแปลกมากสำหรับ Java การreadyระเหยสามารถแก้ไขปัญหานี้ได้หรือไม่? เขาแสดงรหัสนี้: public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { while …


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