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

สัญญาณเป็นแบบดั้งเดิมของการซิงโครไนซ์ที่ติดตามจำนวนทรัพยากรที่มีอยู่ จำกัด



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


8
มี Mutex ใน Java หรือไม่?
มีวัตถุ Mutex ใน java หรือวิธีสร้างหรือไม่? ฉันกำลังถามเนื่องจากวัตถุ Semaphore ที่เริ่มต้นด้วยใบอนุญาต 1 ใบไม่ได้ช่วยฉัน ลองนึกถึงกรณีนี้: try { semaphore.acquire(); //do stuff semaphore.release(); } catch (Exception e) { semaphore.release(); } หากมีข้อยกเว้นเกิดขึ้นเมื่อได้รับครั้งแรกการเปิดตัวในบล็อกจับจะเพิ่มการอนุญาตและสัญญาณไม่ได้เป็นสัญญาณไบนารีอีกต่อไป วิธีที่ถูกต้องจะเป็นอย่างไร try { semaphore.acquire(); //do stuff } catch (Exception e) { //exception stuff } finally { semaphore.release(); } รหัสข้างต้นจะทำให้มั่นใจได้ว่าสัญญาณจะเป็นไบนารีหรือไม่?




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

7
สัญญาณ - การใช้การนับเริ่มต้นคืออะไร?
http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx ในการสร้างเซมาฟอร์ฉันต้องระบุจำนวนเริ่มต้นและจำนวนสูงสุด MSDN ระบุว่าการนับเริ่มต้นคือ - จำนวนคำขอเริ่มต้นสำหรับเซมาฟอร์ที่สามารถให้ได้พร้อมกัน แม้ว่าจะระบุว่าจำนวนสูงสุดคือ จำนวนคำขอสูงสุดสำหรับเซมาฟอร์ที่สามารถให้ได้พร้อมกัน ฉันเข้าใจว่าจำนวนสูงสุดคือจำนวนเธรดสูงสุดที่สามารถเข้าถึงทรัพยากรพร้อมกันได้ แต่การใช้การนับเริ่มต้นคืออะไร? ถ้าฉันสร้างเซมาฟอร์โดยมีจำนวนเริ่มต้นเป็น 0 และจำนวนสูงสุดเป็น 2 เธรดพูลเธรดของฉันจะไม่สามารถเข้าถึงทรัพยากรได้ ถ้าฉันตั้งค่าการนับเริ่มต้นเป็น 1 และจำนวนสูงสุดเป็น 2 เธรดพูลเธรดเท่านั้นที่สามารถเข้าถึงทรัพยากรได้ เฉพาะเมื่อฉันตั้งค่าการนับเริ่มต้นและจำนวนสูงสุดเป็น 2 เธรด 2 เธรดเท่านั้นที่สามารถเข้าถึงทรัพยากรได้พร้อมกัน ดังนั้นฉันจึงสับสนจริงๆเกี่ยวกับความสำคัญของการนับเริ่มต้น? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at …

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