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

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

18
จะรอให้ BackgroundWorker ยกเลิกได้อย่างไร?
พิจารณาวิธีการสมมุติของวัตถุที่ทำสิ่งต่างๆให้คุณ: public class DoesStuff { BackgroundWorker _worker = new BackgroundWorker(); ... public void CancelDoingStuff() { _worker.CancelAsync(); //todo: Figure out a way to wait for BackgroundWorker to be cancelled. } } จะรอให้ BackgroundWorker ทำได้อย่างไร? ในอดีตผู้คนได้พยายาม: while (_worker.IsBusy) { Sleep(100); } แต่การหยุดชะงักนี้เนื่องจากIsBusyไม่ได้รับการล้างจนกว่าRunWorkerCompletedจะมีการจัดการเหตุการณ์และเหตุการณ์นั้นจะไม่สามารถจัดการได้จนกว่าแอปพลิเคชันจะไม่ได้ใช้งาน แอปพลิเคชันจะไม่ทำงานจนกว่าผู้ปฏิบัติงานจะเสร็จสิ้น (นอกจากนี้ยังเป็นห่วงที่วุ่นวาย - น่าขยะแขยง) คนอื่น ๆ ได้เพิ่มการแยกที่แนะนำไว้ใน: while (_worker.IsBusy) { …

11
threadsafe หมายถึงอะไร?
เมื่อเร็ว ๆ นี้ฉันพยายามเข้าถึงกล่องข้อความจากเธรด (นอกเหนือจากเธรด UI) และมีข้อยกเว้นเกิดขึ้น มันพูดบางอย่างเกี่ยวกับ "รหัสไม่ปลอดภัยเธรด" ดังนั้นฉันจึงลงเอยด้วยการเขียนตัวแทน (ตัวอย่างจาก MSDN ช่วย) และเรียกมันแทน แต่ถึงอย่างนั้นฉันก็ไม่ค่อยเข้าใจว่าทำไมต้องใช้รหัสพิเศษทั้งหมด อัปเดต: ฉันจะประสบปัญหาร้ายแรงหรือไม่หากตรวจสอบ Controls.CheckForIllegalCrossThread..blah =true

3
ถือว่าเป็นที่ยอมรับหรือไม่ที่จะไม่เรียก Dispose () บนวัตถุ TPL Task
ฉันต้องการทริกเกอร์งานให้ทำงานบนเธรดพื้นหลัง ฉันไม่อยากรอให้งานเสร็จ ใน. net 3.5 ฉันจะทำสิ่งนี้: ThreadPool.QueueUserWorkItem(d => { DoSomething(); }); ใน. net 4 TPL เป็นวิธีที่แนะนำ รูปแบบทั่วไปที่ฉันเห็นแนะนำคือ: Task.Factory.StartNew(() => { DoSomething(); }); อย่างไรก็ตามStartNew()วิธีการส่งกลับวัตถุซึ่งการดำเนินการTask IDisposableดูเหมือนว่าคนที่แนะนำลายนี้จะมองข้ามไป เอกสาร MSDN เกี่ยวกับTask.Dispose()วิธีการกล่าวว่า: "โทรหา Dispose ทุกครั้งก่อนที่คุณจะปล่อยการอ้างอิงล่าสุดของคุณไปที่งาน" คุณไม่สามารถเรียกทิ้งในงานได้จนกว่าจะเสร็จสิ้นดังนั้นการรอเธรดหลักและเรียกใช้การกำจัดจะทำให้จุดที่ต้องทำบนเธรดพื้นหลังตั้งแต่แรก ดูเหมือนว่าจะไม่มีเหตุการณ์ที่เสร็จสมบูรณ์ / เสร็จสิ้นที่สามารถใช้ในการล้างข้อมูลได้ หน้า MSDN ในคลาสงานไม่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้และหนังสือ "Pro C # 2010 ... " แนะนำรูปแบบเดียวกันและไม่แสดงความคิดเห็นเกี่ยวกับการกำจัดงาน ฉันรู้ว่าถ้าฉันปล่อยทิ้งไว้โปรแกรมสุดท้ายจะจับมันได้ในที่สุด แต่นี่จะกลับมากัดฉันเมื่อฉันทำงานหนักและลืมงานแบบนี้และเธรด Finalizer ท่วมท้นหรือไม่? ดังนั้นคำถามของฉันคือ: ก็เป็นที่ยอมรับที่จะไม่เรียกDispose()ในTaskระดับในกรณีนี้หรือไม่? …

4
เธรด Java ที่ดำเนินการส่วนที่เหลือในลูปบล็อกเธรดอื่น ๆ ทั้งหมด
ข้อมูลโค้ดต่อไปนี้เรียกใช้เธรดสองเธรดหนึ่งคือการบันทึกตัวจับเวลาอย่างง่ายทุกวินาทีวินาทีคือลูปแบบไม่มีที่สิ้นสุดที่รันการดำเนินการที่เหลือ: public class TestBlockingThread { private static final Logger LOGGER = LoggerFactory.getLogger(TestBlockingThread.class); public static final void main(String[] args) throws InterruptedException { Runnable task = () -> { int i = 0; while (true) { i++; if (i != 0) { boolean b = 1 % i == 0; } } …

4
การประมวลผลหลายขั้นตอนเทียบกับมัลติเธรดเทียบกับ asyncio ใน Python 3
ฉันพบว่าในหลาม 3.4 มีห้องสมุดที่แตกต่างกันไม่กี่ multiprocessing / เกลียว: multiprocessing VS เกลียว VS asyncio แต่ไม่รู้จะใช้อันไหนดีหรือ "แนะนำ" พวกเขาทำสิ่งเดียวกันหรือแตกต่างกัน? ถ้าเป็นเช่นนั้นใช้สำหรับอะไร? ฉันต้องการเขียนโปรแกรมที่ใช้มัลติคอร์ในคอมพิวเตอร์ของฉัน แต่ฉันไม่รู้ว่าควรเรียนห้องสมุดไหนดี


2
“ คอลเลกชันถูกกลายพันธุ์ในขณะที่ถูกแจกแจง” บน executeFetchRequest
ตอนนี้ฉันติดปัญหามาหลายชั่วโมงแล้วและอ่านทุกอย่างเกี่ยวกับสิ่งนี้ใน stackoverflow (และใช้ทุกคำแนะนำที่พบ) ตอนนี้ฉันต้องการความช่วยเหลืออย่างเป็นทางการ ; o) นี่คือบริบท: ในโครงการ iPhone ของฉันฉันต้องนำเข้าข้อมูลบนพื้นหลังและแทรกในบริบทวัตถุที่มีการจัดการ ตามคำแนะนำที่พบที่นี่นี่คือสิ่งที่ฉันกำลังทำ: บันทึก moc หลัก จัดเตรียมม็อคพื้นหลังโดยใช้ผู้ประสานงานร้านค้าถาวรที่ใช้โดยมอคหลัก ลงทะเบียนคอนโทรลเลอร์ของฉันเป็นผู้สังเกตการณ์ของการแจ้งเตือน NSManagedObjectContextDidSaveNotification สำหรับ moc พื้นหลัง เรียกใช้วิธีการนำเข้าบนเธรดพื้นหลัง ทุกครั้งที่ได้รับข้อมูลให้ใส่ข้อมูลลงในพื้นหลัง moc เมื่อนำเข้าข้อมูลทั้งหมดแล้วให้บันทึกพื้นหลัง moc รวมการเปลี่ยนแปลงเข้ากับ moc หลักบนเธรดหลัก ยกเลิกการลงทะเบียนคอนโทรลเลอร์ของฉันเป็นผู้สังเกตการณ์สำหรับการแจ้งเตือน รีเซ็ตและปล่อยพื้นหลัง moc บางครั้ง (และสุ่ม) ข้อยกเว้น ... *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFSet: 0x5e0b930> was mutated …

13
ตรวจสอบว่าเธรดปัจจุบันเป็นเธรดหลักหรือไม่
มีวิธีใดในการตรวจสอบว่าเธรดปัจจุบันเป็นเธรดหลักใน Objective-C หรือไม่ ฉันอยากทำอะไรแบบนี้ - (void)someMethod { if (IS_THIS_MAIN_THREAD?) { NSLog(@"ok. this is main thread."); } else { NSLog(@"don't call this method from other thread!"); } }


5
จะซิงโครไนซ์ตัวแปรแบบคงที่ระหว่างเธรดที่รันอินสแตนซ์ของคลาสใน Java ได้อย่างไร
ฉันรู้ว่าการใช้synchronizeคีย์เวิร์ดก่อนที่เมธอดจะนำการซิงโครไนซ์ไปยังวัตถุนั้น นั่นคือ 2 เธรดที่รันอินสแตนซ์เดียวกันของออบเจ็กต์จะซิงโครไนซ์ อย่างไรก็ตามเนื่องจากการซิงโครไนซ์อยู่ที่ระดับอ็อบเจ็กต์ 2 เธรดที่รันอินสแตนซ์ที่แตกต่างกันของอ็อบเจ็กต์จะไม่ซิงโครไนซ์ หากเรามีตัวแปรคงที่ในคลาส Java ที่ถูกเรียกโดยวิธีการเราต้องการให้มันถูกซิงโครไนซ์ข้ามอินสแตนซ์ของคลาส อินสแตนซ์ทั้งสองกำลังทำงานใน 2 เธรดที่แตกต่างกัน เราสามารถทำการซิงโครไนซ์ด้วยวิธีต่อไปนี้ได้หรือไม่? public class Test { private static int count = 0; private static final Object lock= new Object(); public synchronized void foo() { synchronized(lock) { count++; } } } เป็นความจริงหรือไม่ว่าเนื่องจากเราได้กำหนดวัตถุlockที่เป็นแบบคงที่และเรากำลังใช้คีย์เวิร์ดsynchronizedสำหรับการล็อกcountนั้นตอนนี้ตัวแปรคงถูกซิงโครไนซ์ข้ามอินสแตนซ์ของคลาสแล้วTest?

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

1
ApartmentState สำหรับหุ่น
ฉันเพิ่งแก้ไขข้อบกพร่องโดยใช้สิ่งนี้: _Thread.SetApartmentState(ApartmentState.STA); ตอนนี้ฉันอยากจะเข้าใจว่ามันหมายถึงอะไรและทำไมมันถึงได้ผล!


2
การจัดการสัญญาณที่มีหลายเธรดใน Linux
ใน Linux จะเกิดอะไรขึ้นเมื่อโปรแกรม (ซึ่งอาจมีหลายเธรด) ได้รับสัญญาณเช่น SIGTERM หรือ SIGHUP กระทู้ไหนดักฟังสัญญาณ หลายเธรดสามารถรับสัญญาณเดียวกันได้หรือไม่? มีเธรดพิเศษเฉพาะสำหรับการจัดการสัญญาณหรือไม่? ถ้าไม่เกิดอะไรขึ้นภายในเธรดที่จัดการสัญญาณ? การดำเนินการจะดำเนินต่อไปอย่างไรหลังจากรูทีนตัวจัดการสัญญาณเสร็จสิ้น
119 c  linux  multithreading  signals  ipc 

8
python multithreading รอจนกว่าเธรดทั้งหมดจะเสร็จสิ้น
สิ่งนี้อาจถูกถามในบริบทที่คล้ายกัน แต่ฉันไม่สามารถหาคำตอบได้หลังจากค้นหาประมาณ 20 นาทีดังนั้นฉันจะถาม ฉันได้เขียนสคริปต์ Python (สมมติว่า scriptA.py) และสคริปต์ (สมมติว่า scriptB.py) ใน scriptB ฉันต้องการเรียก scriptA หลาย ๆ ครั้งด้วยอาร์กิวเมนต์ที่แตกต่างกันแต่ละครั้งจะใช้เวลาประมาณหนึ่งชั่วโมงในการรัน (มันเป็นสคริปต์ขนาดใหญ่ทำสิ่งต่างๆมากมาย .. ไม่ต้องกังวลกับมัน) และฉันต้องการที่จะสามารถเรียกใช้ scriptA พร้อมอาร์กิวเมนต์ที่แตกต่างกันทั้งหมดพร้อมกัน แต่ฉันต้องรอจนกว่าจะเสร็จสิ้นทั้งหมดก่อนที่จะดำเนินการต่อ รหัสของฉัน: import subprocess #setup do_setup() #run scriptA subprocess.call(scriptA + argumentsA) subprocess.call(scriptA + argumentsB) subprocess.call(scriptA + argumentsC) #finish do_finish() ฉันต้องการเรียกใช้ทั้งหมดsubprocess.call()ในเวลาเดียวกันจากนั้นรอจนกว่าทุกอย่างจะเสร็จสิ้นฉันจะทำอย่างไร ฉันพยายามใช้เธรดดังตัวอย่างที่นี่ : from threading import Thread …

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