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

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

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

7
การทำเธรดในแอปพลิเคชัน PyQt: ใช้เธรด Qt หรือเธรด Python?
ฉันกำลังเขียนแอปพลิเคชัน GUI ที่ดึงข้อมูลผ่านการเชื่อมต่อเว็บเป็นประจำ เนื่องจากการดึงข้อมูลนี้ใช้เวลาสักครู่จึงทำให้ UI ไม่ตอบสนองในระหว่างกระบวนการดึงข้อมูล (ไม่สามารถแบ่งออกเป็นส่วนย่อย ๆ ได้) นี่คือเหตุผลที่ฉันต้องการจ้างการเชื่อมต่อเว็บไปยังเธรดผู้ปฏิบัติงานแยกต่างหาก [ใช่ฉันรู้แล้วตอนนี้ฉันมีปัญหาสองอย่าง] อย่างไรก็ตามแอปพลิเคชันใช้ PyQt4 ดังนั้นฉันต้องการทราบว่าทางเลือกที่ดีกว่าคืออะไร: ใช้เธรดของ Qt หรือใช้threadingโมดูลPython ? ข้อดี / ข้อเสียของแต่ละข้อคืออะไร? หรือคุณมีข้อเสนอแนะที่แตกต่างไปจากเดิมอย่างสิ้นเชิง? แก้ไข (รางวัลใหม่):ในขณะที่วิธีแก้ปัญหาในกรณีเฉพาะของฉันอาจจะใช้คำขอเครือข่ายที่ไม่ปิดกั้นเช่นที่Jeff OberและLukáš Lalinsk (แนะนำ (โดยทั่วไปแล้วจะทิ้งปัญหาการทำงานพร้อมกันไปยังการใช้งานเครือข่าย) แต่ฉันก็ยังต้องการมากกว่านี้ คำตอบเชิงลึกสำหรับคำถามทั่วไป: ข้อดีและข้อเสียของการใช้เธรด PyQt4 (เช่น Qt) บนเธรด Python ดั้งเดิม (จากthreadingโมดูล) คืออะไร? แก้ไข 2:ขอบคุณทุกคำตอบ แม้ว่าจะไม่มีข้อตกลง 100% แต่ดูเหมือนว่าจะมีความเห็นเป็นเอกฉันท์อย่างกว้างขวางว่าคำตอบคือ "ใช้ Qt" เนื่องจากข้อดีของสิ่งนั้นคือการรวมเข้ากับส่วนที่เหลือของห้องสมุดในขณะที่ไม่มีข้อเสียที่แท้จริง สำหรับใครก็ตามที่ต้องการเลือกระหว่างการใช้งานเธรดสองแบบฉันขอแนะนำให้พวกเขาอ่านคำตอบทั้งหมดที่ให้ไว้ที่นี่รวมถึงเธรดรายชื่อเมลของ PyQt ที่เจ้าอาวาสลิงก์ไปด้วย …

5
จะใช้คุณสมบัติ Can CancelToken ได้อย่างไร?
เมื่อเทียบกับรหัสก่อนหน้าสำหรับคลาส RulyCancelerฉันต้องการเรียกใช้โค้ดโดยใช้ CancellationTokenSource. ฉันจะใช้มันตามที่ระบุไว้ในโทเค็นการยกเลิกได้อย่างไรโดยไม่ต้องโยน / จับข้อยกเว้น ฉันสามารถใช้IsCancellationRequestedทรัพย์สินได้หรือไม่? ฉันพยายามใช้มันในลักษณะนี้: cancelToken.ThrowIfCancellationRequested(); และ try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } แต่สิ่งนี้ทำให้เกิดข้อผิดพลาดรันไทม์cancelToken.ThrowIfCancellationRequested();ในวิธีการWork(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at …

8
Java Singleton และการซิงโครไนซ์
โปรดชี้แจงข้อสงสัยของฉันเกี่ยวกับ Singleton และ Multithreading: วิธีใดเป็นวิธีที่ดีที่สุดในการนำ Singleton ไปใช้ใน Java ในสภาพแวดล้อมแบบมัลติเธรด จะเกิดอะไรขึ้นเมื่อหลายเธรดพยายามเข้าถึงgetInstance() วิธีการในเวลาเดียวกัน เราสามารถสร้างซิงเกิลตันได้getInstance() synchronizedหรือไม่? การซิงโครไนซ์จำเป็นจริงๆหรือไม่เมื่อใช้คลาส Singleton

5
iOS เริ่มเธรดพื้นหลัง
ฉันมี sqlitedb ขนาดเล็กในอุปกรณ์ iOS ของฉัน เมื่อผู้ใช้กดปุ่มฉันจะดึงข้อมูลจาก sqlite และแสดงให้ผู้ใช้เห็น ส่วนที่ดึงข้อมูลนี้ฉันต้องการทำในเธรดพื้นหลัง (เพื่อไม่บล็อกเธรดหลักของ UI) ฉันทำแบบนี้ - [self performSelectorInBackground:@selector(getResultSetFromDB:) withObject:docids]; หลังจากดึงข้อมูลและประมวลผลเล็กน้อยฉันต้องอัปเดต UI แต่เนื่องจาก (ตามแนวทางปฏิบัติที่ดี) เราไม่ควรทำการอัปเดต UI จากเธรดพื้นหลัง ฉันเรียกว่าselectorบน mainthread เช่นนั้น - [self performSelectorOnMainThread:@selector(showResults) withObject:nil waitUntilDone:NO]; แต่แอพของฉันขัดข้องในขั้นตอนแรก เช่นเริ่มต้นเธรดพื้นหลัง นี่ไม่ใช่วิธีเริ่มเธรดพื้นหลังใน iOS ใช่ไหม อัปเดต 1:หลังจากที่[self performSelectorInBackground....ฉันได้รับ stacktrace นี้ไม่มีข้อมูลอะไรเลย - อัปเดต 2:ฉันได้ลองเริ่มเธรดพื้นหลังเช่นนั้น - [NSThread detachNewThreadSelector:@selector(getResultSetFromDB:) toTarget:self withObject:docids];แต่ฉันก็ยังได้รับ stacktrace …

1
async (launch :: async) ใน C ++ 11 ทำให้เธรดพูลล้าสมัยเนื่องจากหลีกเลี่ยงการสร้างเธรดที่มีราคาแพงหรือไม่
มันเกี่ยวข้องกับคำถามนี้อย่างหลวม ๆ : std :: thread รวมอยู่ใน C ++ 11 หรือไม่? . แม้ว่าคำถามจะแตกต่างกัน แต่ความตั้งใจก็เหมือนกัน: คำถามที่ 1: การใช้เธรดพูลของคุณเอง (หรือไลบรารีของบุคคลที่สาม) เพื่อหลีกเลี่ยงการสร้างเธรดที่มีราคาแพงหรือไม่ ข้อสรุปในคำถามอื่นคือคุณไม่สามารถพึ่งพาstd::threadการรวมกลุ่มกันได้ (อาจเป็นหรือไม่ก็ได้) อย่างไรก็ตามstd::async(launch::async)ดูเหมือนว่าจะมีโอกาสสูงกว่าที่จะถูกรวมกลุ่ม ไม่คิดว่าจะถูกบังคับโดยมาตรฐาน แต่ IMHO ฉันคาดหวังว่าการใช้งาน C ++ 11 ที่ดีทั้งหมดจะใช้การรวมเธรดหากการสร้างเธรดช้า เฉพาะบนแพลตฟอร์มที่มีราคาไม่แพงในการสร้างเธรดใหม่ฉันคาดหวังว่าพวกเขาจะสร้างเธรดใหม่เสมอ คำถาม 2: นี่เป็นเพียงสิ่งที่ฉันคิด แต่ฉันไม่มีข้อเท็จจริงที่จะพิสูจน์ได้ ฉันอาจจะเข้าใจผิด เป็นการคาดเดาที่มีการศึกษาหรือไม่? สุดท้ายนี้ฉันได้ให้โค้ดตัวอย่างที่แสดงให้เห็นก่อนว่าฉันคิดว่าการสร้างเธรดสามารถแสดงได้อย่างไรasync(launch::async): ตัวอย่างที่ 1: thread t([]{ f(); }); // ... t.join(); กลายเป็น auto future …

6
พร้อมกันกับคิวอนุกรมใน GCD
ฉันกำลังดิ้นรนเพื่อทำความเข้าใจอย่างถ่องแท้เกี่ยวกับคิวแบบต่อเนื่องและแบบอนุกรมใน GCD ฉันมีปัญหาบางอย่างและหวังว่าจะมีคนตอบฉันได้อย่างชัดเจนและตรงประเด็น ฉันกำลังอ่านว่ามีการสร้างและใช้คิวอนุกรมเพื่อดำเนินการทีละงาน อย่างไรก็ตามจะเกิดอะไรขึ้นหาก: ฉันสร้างคิวอนุกรม ฉันใช้dispatch_async(ในคิวอนุกรมที่ฉันเพิ่งสร้างขึ้น) สามครั้งเพื่อส่งสามบล็อก A, B, C สามบล็อกจะดำเนินการ: ตามลำดับ A, B, C เนื่องจากคิวเป็นแบบอนุกรม หรือ ในเวลาเดียวกัน (ในเวลาเดียวกันกับเธรดพาร์ราเลล) เนื่องจากฉันใช้การจัดส่ง ASYNC ฉันกำลังอ่านว่าฉันสามารถใช้dispatch_syncกับคิวพร้อมกันเพื่อดำเนินการบล็อกทีละรายการ ในกรณีนี้ทำไมจึงมีคิวแบบอนุกรมเนื่องจากฉันสามารถใช้คิวพร้อมกันได้ตลอดเวลาซึ่งฉันสามารถส่ง SYNCHRONOUSLY บล็อกได้มากเท่าที่ฉันต้องการ ขอบคุณสำหรับคำอธิบายที่ดี!

6
ตัวอย่างสำหรับ boost shared_mutex (การอ่านหลายครั้ง / การเขียนหนึ่งครั้ง)?
ฉันมีแอปมัลติเธรดที่ต้องอ่านข้อมูลบ่อยครั้งและมีการอัปเดตข้อมูลเป็นครั้งคราว ตอนนี้ mutex ช่วยให้เข้าถึงข้อมูลนั้นได้อย่างปลอดภัย แต่มีราคาแพงเพราะฉันต้องการให้หลายเธรดสามารถอ่านพร้อมกันได้และล็อคเฉพาะเมื่อจำเป็นต้องอัปเดตเท่านั้น (เธรดการอัปเดตอาจรอให้เธรดอื่นเสร็จสิ้น) . ฉันคิดว่านี่คือสิ่งที่boost::shared_mutexควรทำ แต่ฉันไม่ชัดเจนในการใช้งานและยังไม่พบตัวอย่างที่ชัดเจน ใครมีตัวอย่างง่ายๆที่ฉันสามารถใช้เริ่มต้นได้บ้าง?


9
รูปแบบการล็อกสำหรับการใช้. NET MemoryCache อย่างเหมาะสม
ฉันถือว่ารหัสนี้มีปัญหาการเกิดพร้อมกัน: const string CacheKey = "CacheKey"; static string GetCachedData() { string expensiveString =null; if (MemoryCache.Default.Contains(CacheKey)) { expensiveString = MemoryCache.Default[CacheKey] as string; } else { CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(20)) }; expensiveString = SomeHeavyAndExpensiveCalculation(); MemoryCache.Default.Set(CacheKey, expensiveString, cip); } return expensiveString; } สาเหตุของปัญหาการเกิดพร้อมกันคือหลายเธรดสามารถรับคีย์ว่างจากนั้นพยายามแทรกข้อมูลลงในแคช วิธีใดเป็นวิธีที่สั้นและสะอาดที่สุดในการพิสูจน์รหัสพร้อมกันนี้ ฉันชอบทำตามรูปแบบที่ดีในโค้ดที่เกี่ยวข้องกับแคชของฉัน ลิงก์ไปยังบทความออนไลน์จะช่วยได้มาก UPDATE: …

3
รหัสออกจากเธรดคืออะไร?
รหัสออกจากเธรดในหน้าต่างเอาต์พุตขณะทำการดีบักคืออะไร มันให้ข้อมูลอะไรกับฉัน? มันมีประโยชน์อย่างใดหรือเป็นเพียงสิ่งของภายในที่ไม่ควรรบกวนฉัน? The thread 0x552c has exited with code 259 (0x103). The thread 0x4440 has exited with code 0 (0x0). อาจมีรายการรหัสทางออกที่เป็นไปได้พร้อมกับความสำคัญหรือไม่?

4
ความแตกต่างระหว่าง DispatchQueue.main.async และ DispatchQueue.main.sync
ฉันใช้DispatchQueue.main.asyncมานานเพื่อดำเนินการที่เกี่ยวข้องกับ UI Swift จัดเตรียมทั้งDispatchQueue.main.asyncและและDispatchQueue.main.syncและทั้งสองอย่างจะดำเนินการในคิวหลัก ใครช่วยบอกความแตกต่างระหว่างพวกเขาได้ไหม ฉันควรใช้แต่ละครั้งเมื่อใด DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }

2
พฤติกรรมวิธีคงที่ในสภาพแวดล้อมแบบมัลติเธรดใน java
มีคำถามโง่ ๆ ง่ายๆที่กวนใจฉันและมีข้อโต้แย้งมากมายในใจ ฉันต้องการคลายข้อสงสัยทั้งหมดเกี่ยวกับคำถามด้านล่างนี้ class Clstest{ public static String testStaticMethod(String inFileStr) { // section 0 // section 1 // do something with inFileStr // section 2 // section 3 return inFileStr; } } สมมติว่ามีเธรดห้าเธรดที่เรียกใช้งานClstest.testStaticMethod("arg-n")ในเวลาเดียวกัน Clstest.testStaticMethod("arg-1")ด้ายสาย 1 เมื่อด้ายที่ 1 คือในส่วนที่ 1, 2 Clstest.testStaticMethod("arg-2")ด้ายสาย แล้วเธรด 1 จะเกิดอะไรขึ้น? จะเข้าสู่สภาวะหลับใหล? เมื่อเธรด 1 มีโอกาสจะกลับมาดำเนินการต่อจากส่วนที่ 1 …

8
เธรดมีฮีปที่แตกต่างกันหรือไม่?
เท่าที่ฉันรู้ว่าแต่ละเธรดได้รับสแต็กที่แตกต่างกันเมื่อเธรดถูกสร้างขึ้นโดยระบบปฏิบัติการ ฉันสงสัยว่าแต่ละเธรดมีฮีปที่แตกต่างกันหรือไม่?

1
NSDefaultRunLoopMode เทียบกับ NSRunLoopCommonModes
เมื่อใดก็ตามที่ฉันพยายามที่จะดาวน์โหลดไฟล์ขนาดใหญ่ที่อยู่เบื้องหลังUIScrollView, MPMapViewหรือสิ่งที่ขั้นตอนการดาวน์โหลดที่ได้รับการหยุดเร็วที่สุดเท่าที่ฉันสัมผัสหน้าจอ iPhone โชคดีที่โพสต์บล็อกที่ยอดเยี่ยมโดยJörnแนะนำตัวเลือกอื่นNSRunLoopCommonModesสำหรับการเชื่อมต่อ นั่นทำให้ฉันดูรายละเอียดของสองโหมด NSDefaultRunLoopMode และ NSRunLoopCommonModes แต่เอกสารของ Apple ไม่ได้อธิบายอย่างกรุณานอกเหนือจากการพูด NSDefaultRunLoopMode โหมดจัดการกับแหล่งอินพุตอื่นที่ไม่ใช่อ็อบเจ็กต์ NSConnection นี่คือโหมดรันลูปที่ใช้บ่อยที่สุด NSRunLoopCommonModes อ็อบเจ็กต์ที่เพิ่มเข้าในรันลูปโดยใช้ค่านี้เนื่องจากโหมดถูกมอนิเตอร์โดยโหมดรันลูปทั้งหมดที่ได้รับการประกาศให้เป็นสมาชิกของชุดโหมด "ทั่วไป" ดูคำอธิบายของ CFRunLoopAddCommonMode สำหรับรายละเอียด CFRunLoopAddCommonMode แหล่งที่มาตัวจับเวลาและผู้สังเกตการณ์จะได้รับการลงทะเบียนในโหมดรันลูปตั้งแต่หนึ่งโหมดขึ้นไปและจะรันก็ต่อเมื่อรันลูปทำงานในโหมดใดโหมดหนึ่งเท่านั้น โหมดทั่วไปคือชุดของโหมดวนรอบการทำงานที่คุณสามารถกำหนดชุดของแหล่งที่มาตัวจับเวลาและผู้สังเกตการณ์ที่แบ่งใช้โดยโหมดเหล่านี้ ตัวอย่างเช่นแทนที่จะลงทะเบียนซอร์สในโหมด run loop แต่ละโหมดคุณสามารถลงทะเบียนครั้งเดียวกับโหมดหลอกทั่วไปของ run loop และจะถูกลงทะเบียนโดยอัตโนมัติในโหมด run loop แต่ละโหมดในชุดโหมดทั่วไป ในทำนองเดียวกันเมื่อเพิ่มโหมดลงในชุดของโหมดทั่วไปแหล่งที่มาตัวจับเวลาหรือผู้สังเกตการณ์ที่ลงทะเบียนไว้แล้วในโหมดหลอกทั่วไปจะถูกเพิ่มลงในโหมดทั่วไปที่เพิ่มใหม่ ใครช่วยอธิบายทั้งสองเป็นภาษามนุษย์ได้ไหม

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