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

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

4
C #: จะเกิดอะไรขึ้นถ้ามีการเรียกวิธีการแบบคงที่จากหลายเธรด?
ในแอปพลิเคชันของฉันฉันมีวิธีการแบบคงที่ซึ่งเรียกใช้จากหลายเธรดในเวลาเดียวกัน ข้อมูลของฉันจะถูกปะปนหรือไม่? ในความพยายามครั้งแรกของฉันวิธีนี้ไม่คงที่และฉันกำลังสร้างหลายอินสแตนซ์ของคลาส ในกรณีนั้นข้อมูลของฉันก็ปนกัน ฉันไม่แน่ใจว่าสิ่งนี้เกิดขึ้นได้อย่างไรเพราะมันเกิดขึ้นเพียงบางครั้งเท่านั้น ฉันยังคงแก้ไขข้อบกพร่องอยู่ แต่ตอนนี้วิธีนี้เป็นแบบคงที่ฉันไม่มีปัญหาแล้ว บางทีมันอาจจะเป็นแค่โชค ไม่รู้แน่ชัดว่า

3
จำเป็นต้องเข้าใจการใช้งานของ SemaphoreSlim
นี่คือรหัสที่ฉันมี แต่ฉันไม่เข้าใจว่าSemaphoreSlimกำลังทำอะไรอยู่ async Task WorkerMainAsync() { SemaphoreSlim ss = new SemaphoreSlim(10); List<Task> trackedTasks = new List<Task>(); while (DoMore()) { await ss.WaitAsync(); trackedTasks.Add(Task.Run(() => { DoPollingThenWorkAsync(); ss.Release(); })); } await Task.WhenAll(trackedTasks); } void DoPollingThenWorkAsync() { var msg = Poll(); if (msg != null) { Thread.Sleep(2000); // process the long running CPU-bound …

6
CountDownLatch กับ Semaphore
มีประโยชน์จากการใช้ java.util.concurrent.CountdownLatch แทน java.util.concurrent.Semaphore ? เท่าที่ฉันสามารถบอกได้ว่าชิ้นส่วนต่อไปนี้เกือบจะเทียบเท่า: 1. สัญญาณ final Semaphore sem = new Semaphore(0); for (int i = 0; i < num_threads; ++ i) { Thread t = new Thread() { public void run() { try { doStuff(); } finally { sem.release(); } } }; t.start(); } sem.acquire(num_threads); 2: CountDownLatch …

16
รอจนกว่าเธรดทั้งหมดจะทำงานใน java จนเสร็จสิ้น
ฉันกำลังเขียนแอปพลิเคชันที่มี 5 เธรดที่ได้รับข้อมูลบางอย่างจากเว็บพร้อมกันและกรอกข้อมูล 5 ฟิลด์ในคลาสบัฟเฟอร์ ฉันต้องการตรวจสอบความถูกต้องของข้อมูลบัฟเฟอร์และจัดเก็บไว้ในฐานข้อมูลเมื่อเธรดทั้งหมดทำงานเสร็จ ฉันจะทำสิ่งนี้ได้อย่างไร (รับการแจ้งเตือนเมื่อชุดข้อความทั้งหมดทำงานเสร็จสิ้น)

6
วิธีใช้คิวการประมวลผลหลายขั้นตอนใน Python
ฉันมีปัญหามากในการพยายามทำความเข้าใจว่าคิวการประมวลผลหลายตัวทำงานบน python อย่างไรและจะใช้งานอย่างไร สมมติว่าฉันมีโมดูล python สองโมดูลที่เข้าถึงข้อมูลจากไฟล์ที่แชร์ลองเรียกโมดูลทั้งสองนี้ว่าตัวเขียนและผู้อ่าน แผนของฉันคือให้ทั้งผู้อ่านและผู้เขียนใส่คำขอลงในคิวการประมวลผลหลายขั้นตอนแยกกันสองคิวจากนั้นให้กระบวนการที่สามแสดงคำขอเหล่านี้ในลูปและดำเนินการดังกล่าว ปัญหาหลักของฉันคือฉันไม่รู้วิธีใช้ multiprocessing.queue อย่างถูกต้องคุณไม่สามารถสร้างอินสแตนซ์ออบเจ็กต์สำหรับแต่ละกระบวนการได้เนื่องจากจะเป็นคิวแยกกันคุณจะแน่ใจได้อย่างไรว่ากระบวนการทั้งหมดเกี่ยวข้องกับคิวที่ใช้ร่วมกัน (หรือ ในกรณีนี้คือคิว)

6
C ++ ยุติการเรียกโดยไม่มีข้อยกเว้นที่ใช้งานอยู่
ฉันได้รับข้อผิดพลาด C ++ กับเธรด: terminate called without an active exception Aborted นี่คือรหัส: #include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename TYPE> class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &operator<<(TYPE &other) { std::unique_lock<std::mutex> mtx_lock(mtx); while(buffer.size()>=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; …


3
จะรู้ได้อย่างไรว่าอะไรไม่ปลอดภัยในทับทิม?
เริ่มต้นจาก Rails 4ทุกอย่างจะต้องทำงานในสภาพแวดล้อมแบบเธรดโดยค่าเริ่มต้น ความหมายนี้คือโค้ดทั้งหมดที่เราเขียนและ อัญมณีทั้งหมดที่เราใช้จะต้องเป็นthreadsafe ดังนั้นฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้: อะไรที่ไม่ปลอดภัยต่อเกลียวในทับทิม / ราง? Vsอะไรคือความปลอดภัยของเกลียวในทับทิม / ราง? มีรายการของอัญมณีที่เป็นที่รู้จักกันเป็นด้ายหรือในทางกลับกัน? มีรายการรูปแบบทั่วไปของรหัสที่ไม่ใช่ตัวอย่างที่ปลอดภัย@result ||= some_methodหรือไม่ โครงสร้างข้อมูลใน Ruby lang core เช่นHashetc threadsafe หรือไม่? ใน MRI ซึ่งมีGVL/GILซึ่งหมายความว่าเธรดทับทิมเพียง 1 เส้นเท่านั้นที่สามารถทำงานได้ในแต่ละครั้งยกเว้นIOเธรดที่ปลอดภัยมีผลต่อเราหรือไม่?

4
Re-entrant lock และแนวคิดโดยทั่วไปคืออะไร?
ฉันมักจะสับสน จะมีใครอธิบายได้ไหมว่าReentrantหมายถึงอะไรในบริบทต่างๆ แล้วทำไมคุณถึงต้องการใช้ reentrant กับ non-reentrant? พูดว่า pthread (posix) กำลังล็อค primitives พวกเขากลับเข้ามาใหม่หรือไม่? ข้อผิดพลาดใดที่ควรหลีกเลี่ยงเมื่อใช้? mutex re-entrant หรือไม่

4
"การแข่งขันข้อมูล" และ "สภาพการแข่งขัน" เป็นสิ่งเดียวกันในบริบทของการเขียนโปรแกรมพร้อมกัน
ฉันมักจะพบว่ามีการใช้คำเหล่านี้ในบริบทของการเขียนโปรแกรมพร้อมกัน เหมือนกันหรือต่างกัน?

1
Loop ไม่เห็นค่าที่เธรดอื่นเปลี่ยนแปลงโดยไม่มีคำสั่งพิมพ์
ในรหัสของฉันฉันมีลูปที่รอให้สถานะบางอย่างเปลี่ยนจากเธรดอื่น เธรดอื่นใช้งานได้ แต่ลูปของฉันไม่เห็นค่าที่เปลี่ยนแปลง มันรอตลอดไป อย่างไรก็ตามเมื่อฉันใส่System.out.printlnคำสั่งในลูปมันก็ใช้งานได้ทันที! ทำไม? ต่อไปนี้เป็นตัวอย่างรหัสของฉัน: class MyHouse { boolean pizzaArrived = false; void eatPizza() { while (pizzaArrived == false) { //System.out.println("waiting"); } System.out.println("That was delicious!"); } void deliverPizza() { pizzaArrived = true; } } ในขณะที่ลูปในขณะทำงานฉันเรียกใช้deliverPizza()จากเธรดอื่นเพื่อตั้งค่าpizzaArrivedตัวแปร แต่การวนซ้ำจะใช้งานได้ก็ต่อเมื่อฉันไม่ใส่System.out.println("waiting");คำสั่ง เกิดอะไรขึ้น?

7
ความปลอดภัยของเธรด MemoryCache จำเป็นต้องล็อคหรือไม่?
สำหรับผู้เริ่มต้นให้ฉันโยนมันออกไปที่นั่นฉันรู้ว่ารหัสด้านล่างไม่ปลอดภัยสำหรับเธรด (การแก้ไข: อาจจะ) สิ่งที่ฉันกำลังดิ้นรนคือการค้นหาการใช้งานที่เป็นจริงและเป็นสิ่งที่ฉันสามารถทำได้จริงภายใต้การทดสอบ ฉันกำลังปรับโครงสร้างโครงการ WCF ขนาดใหญ่ในขณะนี้ที่ต้องการข้อมูลแบบคงที่ (ส่วนใหญ่) แคชและสร้างจากฐานข้อมูล SQL จำเป็นต้องหมดอายุและ "รีเฟรช" อย่างน้อยวันละครั้งซึ่งเป็นสาเหตุที่ฉันใช้ MemoryCache ฉันรู้ว่ารหัสด้านล่างไม่ควรเป็นเธรดที่ปลอดภัย แต่ฉันไม่สามารถทำให้มันล้มเหลวภายใต้ภาระงานหนักและทำให้เรื่องซับซ้อนขึ้นการค้นหาของ Google จะแสดงการใช้งานทั้งสองวิธี (มีและไม่มีการล็อกรวมกับการอภิปรายว่าจำเป็นหรือไม่ ใครบางคนที่มีความรู้เกี่ยวกับ MemoryCache ในสภาพแวดล้อมแบบมัลติเธรดจะแจ้งให้ฉันทราบอย่างชัดเจนว่าฉันจำเป็นต้องล็อคตำแหน่งที่เหมาะสมหรือไม่เพื่อให้การเรียกเพื่อลบ (ซึ่งแทบจะไม่ถูกเรียก แต่เป็นข้อกำหนด) จะไม่ถูกโยนในระหว่างการเรียกค้น / การจัดตำแหน่งใหม่ public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() …

3
วิธีที่เหมาะสมในการดำเนินงานที่ไม่มีวันสิ้นสุด (ตัวจับเวลาเทียบกับงาน)
ดังนั้นแอปของฉันจำเป็นต้องดำเนินการเกือบจะต่อเนื่อง (โดยหยุดชั่วคราวประมาณ 10 วินาทีระหว่างการรันแต่ละครั้ง) ตราบเท่าที่แอปกำลังทำงานอยู่หรือมีการร้องขอการยกเลิก งานที่ต้องทำมีความเป็นไปได้ที่จะใช้เวลาถึง 30 วินาที จะดีกว่าไหมหากใช้ System.Timers.Timer และใช้ AutoReset เพื่อให้แน่ใจว่าจะไม่ดำเนินการก่อนที่ "ติ๊ก" ก่อนหน้าจะเสร็จสิ้น หรือฉันควรใช้งานทั่วไปในโหมด LongRunning ที่มีโทเค็นการยกเลิกและมีปกติไม่มีที่สิ้นสุดในขณะที่วนซ้ำอยู่ภายในเรียกการดำเนินการที่ทำงานกับเธรด 10 วินาทีนอนหลับระหว่างการโทร? สำหรับโมเดล async / await ฉันไม่แน่ใจว่ามันจะเหมาะสมที่นี่เพราะฉันไม่มีค่าตอบแทนจากการทำงาน CancellationTokenSource wtoken; Task task; void StopWork() { wtoken.Cancel(); try { task.Wait(); } catch(AggregateException) { } } void StartWork() { wtoken = new CancellationTokenSource(); task = …

4
วิธีการเริ่มต้นเธรดสองเธรดที่“ ตรงกัน” ในเวลาเดียวกัน
เธรดควรเริ่มต้นในเสี้ยววินาทีเดียวกัน ผมเข้าใจว่าถ้าคุณทำมันจะใช้เวลามิลลิวินาทีก่อนที่จะดำเนินการต่อไปของthread1.start()thread2.start() มันเป็นไปได้หรือเป็นไปไม่ได้?

28
ตัวอย่างการหยุดชะงักอย่างง่าย
ฉันอยากจะอธิบายการหยุดชะงักของเธรดให้กับมือใหม่ ฉันเคยเห็นตัวอย่างการหยุดชะงักมากมายในอดีตบางคนใช้รหัสและบางส่วนใช้ภาพประกอบ (เช่นรถ 4 คันที่มีชื่อเสียง) นอกจากนี้ยังมีปัญหาคลาสสิกที่หยุดชะงักได้ง่ายเช่นThe Dining Philosophersแต่สิ่งเหล่านี้อาจซับซ้อนเกินกว่าที่มือใหม่จริงๆจะเข้าใจได้อย่างเต็มที่ ฉันกำลังมองหาตัวอย่างโค้ดที่ง่ายที่สุดเพื่อแสดงให้เห็นว่าการหยุดชะงักคืออะไร ตัวอย่างควร: เกี่ยวข้องกับสถานการณ์การเขียนโปรแกรม "จริง" ที่สมเหตุสมผล สั้นมากเรียบง่ายและตรงไปตรงมา คุณแนะนำเมนูใด?

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