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

คำถามที่เกี่ยวข้องหลายเธรดรวมถึงเทคนิคโครงสร้างและปัญหาด้านความปลอดภัย

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

4
ทำไม coroutines ถึงกลับมา? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ส่วนใหญ่ของรากฐานสำหรับ coroutines เกิดขึ้นใน 60s / 70s แล้วหยุดในความโปรดปรานของทางเลือก (เช่นหัวข้อ) มีสารใด ๆ ที่สนใจต่ออายุใน coroutines ที่เกิดขึ้นในหลามและภาษาอื่น ๆ ?

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

7
คุณช่วยอธิบายได้ไหมว่าเหตุใดเธรดจำนวนมากต้องการล็อคบน CPU แบบคอร์เดียว
สมมติว่าเธรดเหล่านี้ทำงานในซีพียูแกนเดียว ในฐานะที่เป็นซีพียูทำงานเพียงคำสั่งเดียวในรอบ แม้จะคิดว่าพวกเขาแบ่งปันทรัพยากรซีพียู แต่คอมพิวเตอร์รับรองว่าครั้งเดียวหนึ่งคำสั่ง ดังนั้นล็อคไม่จำเป็นสำหรับเธรดหลาย ๆ

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

4
ใช้โครงสร้างข้อมูลถาวรในภาษาที่ไม่สามารถใช้งานได้
ภาษาที่ใช้งานได้จริงหรือใกล้เคียงกับการทำงานล้วนได้รับประโยชน์จากโครงสร้างข้อมูลถาวรเนื่องจากมีความไม่เปลี่ยนรูปแบบและเหมาะสมกับรูปแบบการเขียนโปรแกรมเชิงหน้าที่ แต่ในบางครั้งเราจะเห็นไลบรารีของโครงสร้างข้อมูลถาวรสำหรับภาษา (ตามรัฐ, OOP) เช่น Java การอ้างสิทธิ์ที่มักได้ยินในความโปรดปรานของโครงสร้างข้อมูลแบบถาวรคือเนื่องจากพวกมันไม่เปลี่ยนรูปพวกมันจึงปลอดภัยต่อเธรด อย่างไรก็ตามเหตุผลที่โครงสร้างข้อมูลถาวรนั้นมีความปลอดภัยต่อเธรดคือหากเธรดหนึ่งต้องการ "เพิ่ม" องค์ประกอบให้กับคอลเลกชันถาวรการดำเนินการจะส่งกลับคอลเลกชันใหม่เช่นเดิม แต่มีองค์ประกอบที่เพิ่มเข้ามา เธรดอื่นจึงเห็นคอลเลกชันดั้งเดิม แน่นอนว่าคอลเล็กชั่นทั้งสองนี้มีสถานะภายในเป็นจำนวนมาก - นั่นคือสาเหตุที่โครงสร้างถาวรเหล่านี้มีประสิทธิภาพ แต่เนื่องจากเธรดที่แตกต่างกันเห็นสถานะของข้อมูลที่แตกต่างกันจึงดูเหมือนว่าโครงสร้างข้อมูลถาวรนั้นไม่เพียงพอที่จะจัดการกับสถานการณ์ที่เธรดหนึ่งทำการเปลี่ยนแปลงที่สามารถมองเห็นเธรดอื่นได้ สำหรับเรื่องนี้ดูเหมือนว่าเราจะต้องใช้อุปกรณ์เช่นอะตอมการอ้างอิงหน่วยความจำทรานแซคชันของซอฟต์แวร์หรือแม้กระทั่งการล็อคแบบคลาสสิกและกลไกการซิงโครไนซ์ ทำไมจึงเป็นไปไม่ได้ที่ PDSs จะกลายเป็นสิ่งที่มีประโยชน์ต่อ "ความปลอดภัยของเธรด" หรือไม่? มีตัวอย่างจริงที่ PDS ช่วยในการซิงโครไนซ์หรือแก้ไขปัญหาการทำงานพร้อมกันหรือไม่? หรือ PDS เป็นเพียงวิธีหนึ่งในการจัดหาอินเตอร์เฟสแบบไร้รัฐให้กับวัตถุเพื่อสนับสนุนสไตล์การเขียนโปรแกรมที่ใช้งานได้หรือไม่

2
ฉันจะทำให้การก่อสร้างที่เป็นสากลมีประสิทธิภาพมากขึ้นได้อย่างไร
"การก่อสร้างสากล" เป็นคลาส wrapper สำหรับวัตถุตามลำดับที่ทำให้มันเป็นเส้นตรง (เงื่อนไขความมั่นคงที่แข็งแกร่งสำหรับวัตถุที่เกิดขึ้นพร้อมกัน) ตัวอย่างเช่นนี่คือโครงสร้างที่ปราศจากการรอที่ปรับใช้แล้วใน Java จาก [1] ซึ่งทึกทักว่ามีคิวรอที่ปราศจากการรอWFQซึ่งเป็นไปตามSequentialอินเทอร์เฟซ public interface WFQ<T> // "FIFO" iteration { int enqueue(T t); // returns the sequence number of t Iterable<T> iterateUntil(int max); // iterates until sequence max } public interface Sequential { // Apply an invocation (method + arguments) // and get …

3
BackgroundWorker vs. Async / Await
ฉันยังใหม่กับการพัฒนา C # และต้องการสร้าง UI ที่ตอบสนองได้ดีขึ้น ในการวิจัยเบื้องต้นของฉันฉันเห็นสองวิธีในการบรรลุเป้าหมายนี้: มัลติเธรดร่วมกับคลาส BackgroundWorker ตัวดัดแปลง Async / Await ที่ใหม่กว่า ใหม่กว่าหมายความว่าดีกว่า ความแตกต่างระหว่างสองวิธีคืออะไร หากฉันต้องการสร้างโครงการใหม่ฉันจะเลือกวิธีที่จะไปด้วยได้อย่างไร แก้ไข: บางทีฉันควรระบุ ฉันกำลังสร้างแอปพลิเคชัน Windows Forms ซึ่งข้อมูลที่จำเป็นทั้งหมดจะถูกบันทึก / โหลดบนดิสก์ภายในเครื่อง ฉันจะสื่อสารกับอุปกรณ์ USB หลายแห่งด้วย

3
แบบแผนการตั้งชื่อสำหรับวัตถุล็อคเธรดเฉพาะ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว คำถามเล็ก ๆ น้อย ๆ แต่ฉันไม่สามารถหาเอกสารอย่างเป็นทางการหรือแม้กระทั่งบล็อกความคิดเห็น / การอภิปรายเกี่ยวกับมัน พูดง่ายๆ: เมื่อฉันมีวัตถุส่วนตัวซึ่งมีจุดประสงค์เพียงอย่างเดียวที่จะให้บริการส่วนตัวlockฉันจะตั้งชื่อวัตถุนั้นว่าอะไร class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } เราควรตั้งชื่อLockingObjectอะไรที่นี่? นอกจากนี้ให้พิจารณาไม่ใช่แค่ชื่อของตัวแปร แต่จะมีลักษณะอย่างไรเมื่ออยู่ในโค้ดเมื่อล็อค ฉันเคยเห็นตัวอย่างหลายอย่าง แต่ดูเหมือนไม่มีคำแนะนำที่ชัดเจน การใช้งานมากมายSyncRoot(และรูปแบบเช่น_syncRoot) ตัวอย่างโค้ด: lock(SyncRoot) ,lock(_syncRoot) สิ่งนี้ดูเหมือนจะได้รับอิทธิพลจากSyncLockคำสั่งที่เทียบเท่าของ VB SyncRootคุณสมบัติที่มีอยู่ในคลาส ICollection บางส่วนและเป็นส่วนหนึ่งของรูปแบบการออกแบบ SyncRoot …

5
แหล่งข้อมูลที่ดีที่สุดสำหรับการเรียนรู้เกี่ยวกับแอพพลิเคชันพร้อมกันและมัลติเธรดคืออะไร [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ปิดให้บริการใน4 ปีที่แล้ว ล็อคแล้ว คำถามนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ เรียนรู้เพิ่มเติม ฉันรู้ว่าฉันมีช่องว่างความรู้อย่างมากเมื่อพูดถึงแอพพลิเคชั่นแบบมัลติเธรดและการเขียนโปรแกรมพร้อมกัน ฉันได้ครอบคลุมพื้นฐานบางอย่างในอดีต แต่ดูเหมือนว่าส่วนใหญ่จะหายไปจากใจของฉันและมันก็เป็นเรื่องที่ฉันต้องการและจำเป็นต้องมีความรู้มากขึ้น แหล่งข้อมูลที่ดีที่สุดสำหรับการเรียนรู้เกี่ยวกับการสร้างแอปพลิเคชันพร้อมกันคืออะไร ฉันเป็นคนที่มุ่งเน้นการปฏิบัติมากดังนั้นถ้าหนังสือกล่าวว่ามีตัวอย่างที่เป็นรูปธรรมที่ดีกว่า แต่ฉันเปิดให้คำแนะนำ โดยส่วนตัวฉันชอบทำงานใน pseudocode หรือ C ++ และตัวเอียงที่มีต่อการพัฒนาเกมจะดีที่สุด แต่ไม่จำเป็น

3
Async C # 5 จะสนับสนุนปัญหาการซิงโครไนซ์เธรด UI อย่างไร
ฉันได้ยินบางที่ Cync ที่รอคอย async จะยอดเยี่ยมมากจนคุณไม่ต้องกังวลเกี่ยวกับการทำเช่นนี้: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here ดูเหมือนว่าการเรียกกลับของการดำเนินการที่รอจะเกิดขึ้นในเธรดต้นฉบับของผู้โทร มีการระบุไว้หลายครั้งโดย Eric Lippert และ Anders Hejlsberg ว่าคุณลักษณะนี้มีต้นกำเนิดมาจากความต้องการที่จะทำให้ UIs (โดยเฉพาะ UIs อุปกรณ์สัมผัส) ตอบสนองได้ดียิ่งขึ้น ฉันคิดว่าการใช้คุณสมบัติทั่วไปเช่นนี้จะเป็นดังนี้: public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; …

6
วิธีแก้ปัญหาการเข้าใช้ใหม่แบบ Async C # 5
ดังนั้นมีบางอย่างเกี่ยวกับฉันที่สนับสนุน async ใหม่ใน C # 5: ผู้ใช้กดปุ่มที่เริ่มการทำงานของ async การโทรจะส่งกลับทันทีและปั๊มข้อความเริ่มทำงานอีกครั้งนั่นคือจุดรวม ดังนั้นผู้ใช้สามารถกดปุ่มอีกครั้ง - ก่อให้เกิดความเชื่อมั่นอีกครั้ง เกิดอะไรขึ้นถ้านี่เป็นปัญหา ในตัวอย่างที่ฉันได้เห็นพวกเขาจะปิดใช้งานปุ่มก่อนการawaitโทรและเปิดใช้งานอีกครั้งหลังจากนั้น ดูเหมือนว่าฉันจะเป็นทางออกที่เปราะบางมากในแอปที่ใช้งานจริง เราควรเขียนรหัสสถานะเครื่องจักรบางอย่างที่ระบุว่าต้องปิดการใช้งานการควบคุมใดสำหรับชุดการทำงานที่กำหนดไว้ หรือมีวิธีที่ดีกว่า ฉันอยากที่จะแสดงกล่องโต้ตอบเป็นกิริยาช่วยในช่วงระยะเวลาของการดำเนินการ แต่นี่รู้สึกเหมือนใช้ค้อนขนาดใหญ่ มีใครมีความคิดที่สดใสบ้างไหม แก้ไข: ฉันคิดว่าการปิดใช้งานการควบคุมที่ไม่ควรใช้ในขณะที่การดำเนินการกำลังทำงานอยู่มีความเปราะบางเพราะฉันคิดว่ามันจะซับซ้อนอย่างรวดเร็วเมื่อคุณมีหน้าต่างที่มีการควบคุมมากมาย ฉันชอบที่จะทำให้สิ่งต่าง ๆ เรียบง่ายเพราะมันช่วยลดโอกาสในการเกิดข้อบกพร่องทั้งในระหว่างการเข้ารหัสเริ่มต้นและการบำรุงรักษาที่ตามมา จะเกิดอะไรขึ้นถ้ามีชุดควบคุมที่ควรปิดใช้งานสำหรับการดำเนินการเฉพาะอย่าง และจะเกิดอะไรขึ้นถ้าการทำงานหลายอย่างทำงานพร้อมกัน?

2
คอมไพเลอร์ใช้ประโยชน์จากมัลติเธรดเพื่อการรวบรวมที่เร็วขึ้นหรือไม่?
ถ้าฉันจำหลักสูตรคอมไพเลอร์ของฉันได้อย่างถูกต้องคอมไพเลอร์ทั่วไปมีโครงร่างที่เรียบง่ายดังต่อไปนี้: ตัววิเคราะห์คำจะสแกน (หรือเรียกใช้ฟังก์ชั่นการสแกนบางอย่าง) โค้ดต้นฉบับแบบตัวอักษรต่ออักขระ สตริงของอักขระอินพุตถูกตรวจสอบกับพจนานุกรมของ lexemes เพื่อความถูกต้อง หาก lexeme นั้นถูกต้องมันจะถูกจัดประเภทเป็นโทเค็นที่สอดคล้องกับมัน parser ตรวจสอบความถูกต้องของการรวมกันของโทเค็น; token โดยโทเค็น มันเป็นไปได้ในทางทฤษฎีหรือไม่ที่จะแบ่งซอร์สโค้ดออกเป็นควอเตอร์ คอมไพเลอร์มีตัวที่ใช้มัลติเธรดหรือไม่?

1
ฉันจะรู้ได้อย่างไรว่าฉันใช้มัลติเธรดมากเกินไป?
ตอนนี้ฉันรู้สึกว่าฉันใช้งานมัลติเธรดมากเกินไป ฉันมีข้อมูล 3 ประเภทคือ A, B และ C แต่ละคนAสามารถแปลงเป็นหลายBs และแต่ละคนBสามารถแปลงเป็นหลายCs ฉันสนใจเพียงแค่รักษาCs ฉันสามารถเขียนได้อย่างง่ายดายด้วยฟังก์ชันแปลงสองอย่าง แต่ผมจับตัวเองดำเนินการกับกระทู้, สามคิว ( queue_a, queue_bและqueue_c) มีสองเธรดที่ทำการแปลงต่างกันและผู้ปฏิบัติงานหนึ่งคน: ConverterAอ่านจากqueue_aและเขียนถึงqueue_b ConverterBอ่านจากqueue_bและเขียนถึงqueue_c Worker จัดการแต่ละองค์ประกอบจาก queue_c การแปลงค่อนข้างธรรมดาและฉันไม่รู้ว่ารุ่นนี้ซับซ้อนเกินไปหรือไม่ แต่ดูเหมือนว่าแข็งแกร่งสำหรับฉันมาก "ตัวแปลง" แต่ละตัวสามารถเริ่มทำงานได้ก่อนที่ข้อมูลจะมาถึงคิวและเมื่อใดก็ตามในรหัสที่ฉันสามารถ "ส่ง" ใหม่AหรือBs และมันจะทริกเกอร์ไปป์ไลน์การแปลงซึ่งจะเรียกใช้งานโดยคนงาน เกลียว. แม้แต่รหัสผลลัพธ์ก็ดูเรียบง่ายขึ้น แต่ฉันก็ยังไม่แน่ใจว่าฉันใช้เธรดอย่างไม่เหมาะสมหรือไม่

5
CPU / คอร์หลายตัวสามารถเข้าถึง RAM เดียวกันได้หรือไม่
นี่คือสิ่งที่ฉันคิดว่าจะเกิดขึ้น: หากสองคอร์พยายามเข้าถึงที่อยู่เดียวกันใน RAM ใครจะต้องรอให้อีกคนหนึ่งเข้าถึง RAM สองเวลานั้นแต่ละคอร์จะพยายามที่จะเข้าถึงที่อยู่เดียวกันพวกเขาก็อาจจะยังคงมี RAM ที่เก็บไว้ชั่วคราวเพื่อให้พวกเขาสามารถเข้าถึงตนแคชพร้อมกัน หากสองคอร์พยายามเข้าถึงที่อยู่ที่แตกต่างกันใน RAM เดียวกันจะต้องรอให้อีกสองเครื่องเข้าถึง RAM ในคำอื่น ๆ ฉันจะจินตนาการว่าสำหรับงานเขียนโปรแกรมแบบเข้มข้นของ RAM การประมวลผลหลายตัวไม่ได้ช่วยอะไรมากนอกจากว่ามันจะเกี่ยวข้องกับการอ่านจากที่อยู่เดียวกันใน RAM หลายครั้งต่อหนึ่งคอร์ ดังนั้นซีพียูหลายคอร์ / สามารถเข้าถึง RAM เดียวกันพร้อมกันหรือสิ่งที่ฉันพูดถูกต้องหรือไม่

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