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

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

4
จับข้อยกเว้นที่ถูกโยนในเธรดที่แตกต่างกัน
หนึ่งในวิธีของฉัน ( Method1) สร้างเธรดใหม่ เธรดนั้นดำเนินการเมธอด ( Method2) และในระหว่างการดำเนินการจะมีการยกเว้น ฉันต้องการรับข้อมูลข้อยกเว้นนั้นเกี่ยวกับวิธีการโทร ( Method1) มีบางครั้งที่ฉันสามารถจับข้อยกเว้นMethod1นี้ได้Method2หรือไม่?

16
Android - ป้องกันหน้าจอสีขาวเมื่อเริ่มต้น
อย่างที่เราทราบกันดีว่าแอพ Android จำนวนมากแสดงหน้าจอสีขาวสั้น ๆ ก่อนที่จะActivityเข้าสู่โฟกัสครั้งแรก ปัญหานี้เกิดขึ้นในกรณีต่อไปนี้: แอป Android ที่ขยายระดับสากลApplicationและดำเนินการเริ่มต้นที่สำคัญในนั้น Application วัตถุที่ถูกสร้างขึ้นเสมอก่อนที่จะเป็นครั้งแรกActivity(ความจริงที่สามารถสังเกตได้ในการดีบัก) ดังนั้นนี้ทำให้รู้สึก นี่คือสาเหตุของความล่าช้าในกรณีของฉัน แอพ Android ที่แสดงหน้าต่างแสดงตัวอย่างเริ่มต้นก่อนหน้าจอเริ่มต้น android:windowDisablePreview = "true"เห็นได้ชัดว่าการตั้งค่าไม่ทำงานที่นี่ ฉันไม่สามารถตั้งค่าธีมหลักของหน้าจอเริ่มต้นTheme.Holo.NoActionBarเป็นตามที่อธิบายไว้ที่นี่ได้เนื่องจาก [น่าเสียดาย] หน้าจอเริ่มต้นของฉันใช้ActionBarไฟล์. ในขณะเดียวกันแอปที่ไม่ขยายApplicationชั้นเรียนจะไม่แสดงหน้าจอสีขาวเมื่อเริ่มต้น สิ่งนี้คือหลักการเริ่มต้นที่ดำเนินการในApplicationวัตถุจำเป็นต้องเกิดขึ้นก่อนที่Activityจะแสดงครั้งแรก ดังนั้นคำถามของฉันคือฉันจะทำการเริ่มต้นเหล่านี้ในการเริ่มต้นแอปโดยไม่ใช้Applicationวัตถุได้อย่างไร อาจใช้ a ThreadหรือServiceฉันคิดว่า? นี่เป็นปัญหาที่น่าคิด ฉันไม่สามารถข้ามมันได้ตามปกติ (โดยการตั้งค่าNoActionBarธีม) เนื่องจากน่าเศร้าที่หน้าจอ Splash ของฉันมีActionBarสาเหตุที่ไม่เกี่ยวข้องกัน บันทึก: ฉันได้อ้างถึงคำถามต่อไปนี้แล้ว: วิธีแก้ไขหน้าจอสีขาวบนแอพเริ่มต้นขึ้น หน้าจอเริ่มต้น Android เป็นสีขาว? หน้าจอสีขาวก่อนหน้าจอเริ่มต้น พื้นหลังสีขาวเมื่อแอป Android เริ่มทำงาน เหตุใดจึงมีหน้าจอสีขาวปรากฏขึ้นเป็นเวลา 1 วินาทีเมื่อเริ่มเรียกใช้แอปใน Android อ้างอิง: รูปแบบ …

5
การตัดสินใจระหว่างกระบวนการย่อยการประมวลผลหลายกระบวนการและเธรดใน Python?
ฉันต้องการขนานโปรแกรม Python ของฉันเพื่อให้สามารถใช้โปรเซสเซอร์หลายตัวบนเครื่องที่ทำงานได้ การทำให้ขนานของฉันง่ายมากโดยที่ "เธรด" แบบขนานทั้งหมดของโปรแกรมจะเป็นอิสระและเขียนเอาต์พุตไปยังไฟล์แยกต่างหาก ฉันไม่ต้องการเธรดเพื่อแลกเปลี่ยนข้อมูล แต่มีความจำเป็นที่ฉันต้องรู้ว่าเมื่อเธรดเสร็จสิ้นเนื่องจากขั้นตอนบางอย่างของไปป์ไลน์ของฉันขึ้นอยู่กับเอาต์พุต การพกพาเป็นสิ่งสำคัญเพราะฉันต้องการให้สิ่งนี้ทำงานบน Python เวอร์ชันใดก็ได้บน Mac, Linux และ Windows ด้วยข้อ จำกัด เหล่านี้โมดูล Python ใดที่เหมาะสมที่สุดสำหรับการใช้งานสิ่งนี้ ฉันกำลังพยายามตัดสินใจระหว่างเธรดกระบวนการย่อยและการประมวลผลหลายขั้นตอนซึ่งดูเหมือนจะมีฟังก์ชันที่เกี่ยวข้อง มีความคิดเห็นเกี่ยวกับเรื่องนี้ไหม ฉันต้องการโซลูชันที่ง่ายที่สุดที่พกพาได้


13
จะรอให้เธรดจำนวนหนึ่งเสร็จสมบูรณ์ได้อย่างไร?
มีวิธีใดเพียงแค่รอให้กระบวนการเธรดทั้งหมดเสร็จสิ้น ตัวอย่างเช่นสมมติว่าฉันมี: public class DoSomethingInAThread implements Runnable{ public static void main(String[] args) { for (int n=0; n<1000; n++) { Thread t = new Thread(new DoSomethingInAThread()); t.start(); } // wait for all threads' run() methods to complete before continuing } public void run() { // do something here } } ฉันจะแก้ไขสิ่งนี้ได้อย่างไรเพื่อให้main()เมธอดหยุดที่ข้อคิดเห็นจนกว่าrun()วิธีการของเธรดทั้งหมดจะออก …


5
ฉันจะเลือกระหว่าง Semaphore และ SemaphoreSlim ได้อย่างไร?
อินเทอร์เฟซสาธารณะของพวกเขาดูเหมือนกัน เอกสารระบุว่า SemaphoreSlim เป็นทางเลือกที่มีน้ำหนักเบาและไม่ได้ใช้สัญญาณเคอร์เนลของ Windows แหล่งข้อมูลนี้ระบุว่า SemaphoreSlim เร็วกว่ามาก ในสถานการณ์ใดที่ SemaphoreSlim มีความหมายมากกว่า Semaphore และในทางกลับกัน

4
การกำหนดค่าอ้างอิงเป็นแบบอะตอมเหตุใดจึงจำเป็นต้องมี Interlocked.Exchange (ref Object, Object)?
ในบริการเว็บ asmx แบบมัลติเธรดของฉันฉันมีฟิลด์คลาส _allData ของประเภท SystemData ของฉันเองซึ่งประกอบด้วยไม่กี่รายการList<T>และDictionary<T>ทำเครื่องหมายเป็นvolatile. ข้อมูลระบบ ( _allData) ถูกรีเฟรชเป็นครั้งคราวและฉันทำได้โดยการสร้างออบเจ็กต์อื่นที่เรียกว่าnewDataและเติมโครงสร้างข้อมูลด้วยข้อมูลใหม่ เมื่อเสร็จแล้วฉันก็มอบหมาย private static volatile SystemData _allData public static bool LoadAllSystemData() { SystemData newData = new SystemData(); /* fill newData with up-to-date data*/ ... _allData = newData. } สิ่งนี้ควรใช้งานได้เนื่องจากการกำหนดเป็นแบบปรมาณูและเธรดที่มีการอ้างอิงถึงข้อมูลเก่ายังคงใช้งานต่อไปและส่วนที่เหลือจะมีข้อมูลระบบใหม่หลังการมอบหมาย แต่คนสอนฉันบอกว่าแทนการใช้volatileคำหลักและมอบหมายง่ายฉันควรใช้InterLocked.Exchangeเพราะเขาบอกว่าบนแพลตฟอร์มบางคนก็ไม่ได้รับประกันว่าได้รับมอบหมายอ้างอิงอะตอม ยิ่งไปกว่านั้น: เมื่อฉันประกาศthe _allDataฟิลด์เป็นvolatileไฟล์ Interlocked.Exchange<SystemData>(ref _allData, newData); สร้างคำเตือน "การอ้างอิงถึงเขตข้อมูลที่มีความผันผวนจะไม่ถือว่าเป็นความผันผวน" ฉันควรคิดอย่างไรเกี่ยวกับเรื่องนี้

6
จะปรับขนาดเธรดตามแกน CPU ได้อย่างไร?
ฉันต้องการแก้ปัญหาทางคณิตศาสตร์ด้วยเธรดหลายเธรดใน Java ปัญหาทางคณิตศาสตร์ของฉันสามารถแบ่งออกเป็นหน่วยงานที่ฉันต้องการแก้ไขในหลายเธรด ฉันไม่ต้องการให้เธรดจำนวนคงที่ใช้งานได้ แต่จำนวนเธรดที่ตรงกับจำนวนแกน CPU แทน ปัญหาของฉันคือฉันไม่พบบทแนะนำง่ายๆในอินเทอร์เน็ตสำหรับสิ่งนี้ ทั้งหมดที่ฉันพบคือตัวอย่างที่มีเธรดคงที่ จะทำได้อย่างไร? คุณสามารถให้ตัวอย่างได้หรือไม่?

3
ความปลอดภัยของเธรดในพจนานุกรมของ Python
ฉันมีชั้นเรียนที่มีพจนานุกรม class OrderBook: orders = {'Restaurant1': None, 'Restaurant2': None, 'Restaurant3': None, 'Restaurant4': None} @staticmethod def addOrder(restaurant_name, orders): OrderBook.orders[restaurant_name] = orders และฉันทำงาน 4 กระทู้ (หนึ่งสำหรับแต่ละร้านอาหาร) OrderBook.addOrderที่เรียกวิธี นี่คือฟังก์ชั่นที่รันโดยแต่ละเธรด: def addOrders(restaurant_name): #creates orders ... OrderBook.addOrder(restaurant_name, orders) มีความปลอดภัยนี้หรือฉันจะต้องใช้ล็อคก่อนที่จะเรียกaddOrder?

6
จะตรวจสอบเธรดปัจจุบันใน Swift 3 ได้อย่างไร
ฉันจะตรวจสอบได้อย่างไรว่าอันไหนคือเธรดปัจจุบันใน Swift 3 ใน Swift เวอร์ชันก่อนหน้าคุณสามารถตรวจสอบได้ว่าเธรดปัจจุบันเป็นเธรดหลักหรือไม่โดยทำสิ่งนี้: NSThread.isMainThread()

9
การใช้ yield () หลักคืออะไรและแตกต่างจาก join () และ interrupt () อย่างไร?
ฉันสับสนเล็กน้อยเกี่ยวกับการใช้yield()วิธีการใน Java โดยเฉพาะในโค้ดตัวอย่างด้านล่าง ฉันยังอ่านว่า yield () คือ 'ใช้เพื่อป้องกันการดำเนินการของเธรด' คำถามของฉันคือ: ฉันเชื่อว่าโค้ดด้านล่างให้ผลลัพธ์เดียวกันทั้งเมื่อใช้yield()และเมื่อไม่ใช้งาน ถูกต้องหรือไม่ ที่จริงแล้วการใช้งานหลักคือyield()อะไร? ในสิ่งที่วิธีคือyield()แตกต่างจากjoin()และinterrupt()วิธีการ? ตัวอย่างรหัส: public class MyRunnable implements Runnable { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); for(int i=0; i<5; i++) { System.out.println("Inside main"); } } public void run() { for(int i=0; i<5; i++) …


8
จะทำให้แอปคอนโซล. NET ทำงานได้อย่างไร
พิจารณาแอปพลิเคชันคอนโซลที่เริ่มต้นบริการบางอย่างในเธรดแยกต่างหาก สิ่งที่ต้องทำคือรอให้ผู้ใช้กด Ctrl + C เพื่อปิดเครื่อง วิธีใดเป็นวิธีที่ดีกว่าในการดำเนินการนี้ static ManualResetEvent _quitEvent = new ManualResetEvent(false); static void Main() { Console.CancelKeyPress += (sender, eArgs) => { _quitEvent.Set(); eArgs.Cancel = true; }; // kick off asynchronous stuff _quitEvent.WaitOne(); // cleanup/shutdown and quit } หรือสิ่งนี้โดยใช้ Thread.Sleep (1): static bool _quitFlag = false; static void Main() …

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

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