คำถามติดแท็ก thread-safety

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

16
การสะสมถูกแก้ไข; การดำเนินการแจงนับอาจไม่ทำงาน
ฉันไม่สามารถไปที่ด้านล่างของข้อผิดพลาดนี้ได้เพราะเมื่อมีการแนบตัวดีบั๊กมันจะไม่เกิดขึ้น ด้านล่างเป็นรหัส นี่คือเซิร์ฟเวอร์ WCF ในบริการ Windows เมธอด NotifySubscribeers ถูกเรียกโดยบริการเมื่อใดก็ตามที่มีเหตุการณ์ข้อมูล (ตามช่วงเวลาที่สุ่ม แต่ไม่บ่อยมาก - ประมาณ 800 ครั้งต่อวัน) เมื่อไคลเอนต์ Windows Forms สมัครสมาชิก ID สมาชิกจะถูกเพิ่มไปยังพจนานุกรมสมาชิกและเมื่อลูกค้ายกเลิกสมาชิกมันจะถูกลบออกจากพจนานุกรม ข้อผิดพลาดเกิดขึ้นเมื่อ (หรือหลังจาก) ลูกค้ายกเลิกการเป็นสมาชิก ปรากฏว่าในครั้งต่อไปที่เรียกใช้เมธอด NotifySubscribers () ลูป foreach () จะล้มเหลวด้วยข้อผิดพลาดในบรรทัดหัวเรื่อง วิธีการเขียนข้อผิดพลาดลงในบันทึกการใช้งานตามที่แสดงในรหัสด้านล่าง เมื่อมีการแนบดีบักเกอร์และการยกเลิกการเป็นลูกค้ารหัสจะทำงานได้ดี คุณเห็นปัญหาเกี่ยวกับรหัสนี้หรือไม่? ฉันต้องทำให้พจนานุกรมปลอดภัยไหม? [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class SubscriptionServer : ISubscriptionServer { private static IDictionary<Guid, Subscriber> subscribers; public SubscriptionServer() { …

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

8
ล็อคทำงานอย่างไร
ฉันเห็นว่าสำหรับการใช้วัตถุที่ไม่ปลอดภัยเธรดเราห่อรหัสด้วยล็อคเช่นนี้ private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } ดังนั้นจะเกิดอะไรขึ้นเมื่อหลายเธรดเข้าถึงรหัสเดียวกัน (สมมติว่ามันกำลังทำงานอยู่ในเว็บแอปพลิเคชัน ASP.NET) พวกเขาเข้าคิวหรือไม่ ถ้าเป็นเช่นนั้นพวกเขาจะรอนานแค่ไหน? ประสิทธิภาพการทำงานมีผลกระทบอะไรบ้างจากการใช้ระบบล็อค?

3
ใช้กรณีสำหรับ RxJava schedulers
ใน RxJava มี5 ตัวเลือกที่แตกต่างกันให้เลือก: ทันที () : สร้างและส่งคืน Scheduler ที่ทำงานทันทีบนเธรดปัจจุบัน trampoline () : สร้างและส่งคืน Scheduler ที่จัดคิวงานบนเธรดปัจจุบันที่จะดำเนินการหลังจากงานปัจจุบันเสร็จสมบูรณ์ newThread () : สร้างและส่งคืน Scheduler ที่สร้างเธรดใหม่สำหรับแต่ละหน่วยงาน การคำนวณ () : สร้างและส่งคืน Scheduler สำหรับการคำนวณ สามารถใช้สำหรับการวนรอบเหตุการณ์การประมวลผลการเรียกกลับและงานคำนวณอื่น ๆ อย่าทำงานที่ถูกผูกไว้กับ IO บนตัวกำหนดตารางเวลานี้ ใช้ Schedulers io ()แทน io () : สร้างและส่งคืน Scheduler สำหรับงานที่มีขอบเขต IO การใช้งานได้รับการสนับสนุนโดยเธรดพู Executionor ที่จะเติบโตตามที่ต้องการ สามารถใช้สำหรับการบล็อก IO แบบอะซิงโครนัส …

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

11
Java วิธีการทำข้อมูลให้ตรงกันล็อคกับวัตถุหรือวิธี?
ถ้าฉันมีวิธีการซิงโครไนส์ 2 วิธีในคลาสเดียวกัน แต่แต่ละวิธีเข้าถึงตัวแปรที่แตกต่างกัน 2 เธรดสามารถเข้าถึง 2 วิธีเหล่านั้นในเวลาเดียวกันได้หรือไม่ ล็อคเกิดขึ้นกับวัตถุหรือมีความเฉพาะเจาะจงกับตัวแปรภายในวิธีการซิงโครไนซ์หรือไม่? ตัวอย่าง: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2 เธรดสามารถเข้าถึงอินสแตนซ์เดียวกันของคลาส X ที่มีประสิทธิภาพx.addA() และx.addB()ในเวลาเดียวกันได้หรือไม่

7
Queue.Queue vs. collection.deque
ฉันต้องการคิวที่หลายเธรดสามารถใส่ข้อมูลและหลายกระทู้อาจอ่านได้ Python มีคลาสคิวอย่างน้อยสองคลาสคือ Queue.Queue และ collection.deque โดยที่ก่อนหน้านี้ดูเหมือนจะใช้หลังภายใน ทั้งสองอ้างว่าปลอดภัยต่อเธรดในเอกสารประกอบ อย่างไรก็ตามคิวเอกสารยังระบุ: collection.deque เป็นการใช้งานทางเลือกของคิวที่ไม่ได้ถูก จำกัด ด้วยการดำเนินการผนวกอะตอมอย่างรวดเร็ว () และ popleft () ที่ไม่ต้องการการล็อค ซึ่งฉันคิดว่าฉันไม่ได้พูดค่อนข้างไกล: นี่หมายความว่า deque ไม่ได้เป็นเธรดที่ปลอดภัยทั้งหมดหรือไม่? ถ้าเป็นฉันอาจไม่เข้าใจความแตกต่างระหว่างสองคลาสอย่างสมบูรณ์ ฉันเห็นว่าคิวเพิ่มฟังก์ชันการบล็อก ในทางกลับกันจะสูญเสียคุณสมบัติบางอย่างเช่นการสนับสนุนสำหรับผู้ประกอบการ การเข้าถึงวัตถุ deque ภายในโดยตรงคือ x ในคิว (). deque ด้ายปลอดภัย? นอกจากนี้เหตุใดคิวจึงใช้ mutex สำหรับการดำเนินการเมื่อ deque ปลอดภัยต่อเธรดแล้ว

9
การทำให้รูปแบบรหัส InvokeRequired เป็นแบบอัตโนมัติ
ฉันได้รับรู้ถึงความเจ็บปวดอย่างถี่ถ้วนว่าบ่อยครั้งที่เราต้องเขียนรูปแบบโค้ดต่อไปนี้ในโค้ด GUI ที่ควบคุมโดยเหตุการณ์ private void DoGUISwitch() { // cruisin for a bruisin' through exception city object1.Visible = true; object2.Visible = false; } กลายเป็น: private void DoGUISwitch() { if (object1.InvokeRequired) { object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); })); } else { object1.Visible = true; object2.Visible = false; } } นี่เป็นรูปแบบที่น่าอึดอัดใจใน C # …

4
สิ่งใดที่ทำให้เธรดปลอดภัย กฎคืออะไร?
มีกฎ / แนวทางโดยรวมสำหรับสิ่งที่ทำให้เมธอดปลอดภัยหรือไม่? ฉันเข้าใจว่าอาจมีสถานการณ์แบบครั้งเดียวมากกว่าหนึ่งล้านครั้ง แต่โดยทั่วไปแล้วเกี่ยวกับอะไร มันง่ายหรือไม่ หากวิธีการเข้าถึงตัวแปรท้องถิ่นเท่านั้นมันเป็นหัวข้อที่ปลอดภัย มันคืออะไร ที่ใช้สำหรับวิธีการแบบคงที่เช่นกัน? หนึ่งคำตอบที่ได้รับจาก @Cybis คือ: ไม่สามารถแชร์ตัวแปรโลคัลระหว่างเธรดได้เนื่องจากแต่ละเธรดได้รับสแต็กของตนเอง เป็นกรณีสำหรับวิธีคงที่เช่นกัน? หากวิธีการใดผ่านวัตถุอ้างอิงความปลอดภัยของเธรดจะทำลายได้หรือไม่ ฉันได้ทำการวิจัยและมีหลายอย่างเกี่ยวกับบางกรณี แต่ฉันหวังว่าจะสามารถกำหนดได้โดยใช้กฎเพียงไม่กี่แนวทางเพื่อปฏิบัติตามเพื่อให้แน่ใจว่าวิธีนั้นปลอดภัยสำหรับเธรด ดังนั้นฉันคิดว่าคำถามสุดท้ายของฉันคือ: "มีรายการสั้น ๆ ของกฎที่กำหนดวิธีการเธรดที่ปลอดภัยหรือไม่ถ้าใช่พวกเขาคืออะไร?" แก้ไข มีการทำคะแนนที่ดีมากมายที่นี่ ฉันคิดว่าคำตอบที่แท้จริงสำหรับคำถามนี้คือ: "ไม่มีกฎง่ายๆเพื่อความปลอดภัยของเธรด" เย็น. ละเอียด. แต่โดยทั่วไปฉันคิดว่าคำตอบที่ยอมรับนั้นให้บทสรุปสั้น ๆ ที่ดี มีข้อยกเว้นอยู่เสมอ ดังนั้นไม่ว่าจะเป็น ฉันสามารถอยู่กับที่
156 c#  thread-safety 

5
การทำซ้ำ ConcurrentHashMap ทำให้เธรดปลอดภัยหรือไม่
ใน javadoc สำหรับConcurrentHashMapมีดังต่อไปนี้: การดำเนินการดึงข้อมูล (รวมทั้งรับ) โดยทั่วไปจะไม่บล็อกดังนั้นอาจทับซ้อนกับการดำเนินการอัปเดต (รวมถึงการย้ายและลบ) การดึงข้อมูลสะท้อนถึงผลลัพธ์ของการดำเนินการอัปเดตล่าสุดที่เสร็จสิ้นเมื่อเริ่มมีอาการ สำหรับการดำเนินการรวมเช่น putAll และ clear การดึงข้อมูลพร้อมกันอาจสะท้อนถึงการแทรกหรือการลบบางรายการเท่านั้น ในทำนองเดียวกัน Iterators และ Enumerations จะส่งคืนองค์ประกอบที่สะท้อนสถานะของตารางแฮช ณ จุดหนึ่งหรือตั้งแต่การสร้างตัววนซ้ำ / การแจงนับ พวกเขาจะไม่โยน ConcurrentModificationException อย่างไรก็ตามตัววนซ้ำได้รับการออกแบบให้ใช้งานได้ครั้งละหนึ่งเธรดเท่านั้น มันหมายความว่าอะไร? จะเกิดอะไรขึ้นถ้าฉันพยายามทำซ้ำแผนที่ด้วยสองเธรดในเวลาเดียวกัน จะเกิดอะไรขึ้นถ้าฉันใส่หรือลบค่าออกจากแผนที่ในขณะที่วนซ้ำ

5
HashSet พร้อมกันใน. NET Framework
ฉันมีคลาสต่อไปนี้ class Test{ public HashSet<string> Data = new HashSet<string>(); } ฉันต้องการเปลี่ยนฟิลด์ "ข้อมูล" จากเธรดที่แตกต่างกันดังนั้นฉันต้องการความคิดเห็นบางส่วนเกี่ยวกับการใช้งานเธรดที่ปลอดภัยในปัจจุบัน class Test{ public HashSet<string> Data = new HashSet<string>(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } มีวิธีแก้ปัญหาที่ดีกว่าไปยังฟิลด์โดยตรงและป้องกันไม่ให้เข้าถึงหลายเธรดพร้อมกันหรือไม่

5
C # Thread ปลอดภัยอย่างรวดเร็ว (EST) เคาน์เตอร์
วิธีการขอรับตัวนับเธรดที่ปลอดภัยใน C # ด้วยประสิทธิภาพที่ดีที่สุดที่เป็นไปได้คืออะไร สิ่งนี้ง่ายพอ ๆ กับที่ได้รับ: public static long GetNextValue() { long result; lock (LOCK) { result = COUNTER++; } return result; } แต่มีทางเลือกอื่นเร็วขึ้นหรือไม่

5
วิธีคงที่ไม่ซิงโครไนซ์เธรดปลอดภัยหรือไม่ถ้าพวกเขาไม่แก้ไขตัวแปรคลาสคงที่
ฉันสงสัยว่าคุณมีวิธีการคงที่ที่ไม่ได้ทำข้อมูลให้ตรงกัน แต่ไม่ได้แก้ไขตัวแปรคงที่ใด ๆ มันเป็นเธรดที่ปลอดภัยหรือไม่ จะเกิดอะไรขึ้นถ้าเมธอดสร้างตัวแปรโลคอลภายในมัน? ตัวอย่างเช่นรหัสต่อไปนี้ปลอดภัยไหม? public static String[] makeStringArray( String a, String b ){ return new String[]{ a, b }; } ดังนั้นถ้าฉันมีสองเธรดเรียกวิธีการอย่างต่อเนื่องและพร้อมกันหนึ่งกับสุนัข (พูดว่า "Great dane" และ "bull dog") และอื่น ๆ ที่มีแมว (พูดว่า "เปอร์เซีย" และ "สยาม") ฉันจะเคยได้รับแมวและสุนัข อยู่ในอาร์เรย์เดียวกันหรือไม่ หรือแมวและสุนัขจะไม่อยู่ในกระบวนการเดียวกันในเวลาเดียวกันหรือไม่?

8
การตรวจสอบเธรดปลอดภัยหรือไม่
ฉันรู้ว่าการดำเนินการผสมเช่นi++ไม่ปลอดภัยตามที่พวกเขาเกี่ยวข้องกับการดำเนินงานหลาย ๆ แต่การตรวจสอบการอ้างอิงด้วยตัวเองเป็นการดำเนินการที่ปลอดภัยของเธรดหรือไม่ a != a //is this thread-safe ฉันพยายามเขียนโปรแกรมนี้และใช้หลายเธรด แต่ก็ไม่ได้ล้มเหลว ฉันเดาว่าฉันไม่สามารถจำลองการแข่งขันบนเครื่องของฉันได้ แก้ไข: public class TestThreadSafety { private Object a = new Object(); public static void main(String[] args) { final TestThreadSafety instance = new TestThreadSafety(); Thread testingReferenceThread = new Thread(new Runnable() { @Override public void run() { long countOfIterations = …

4
ตกลงเพื่อใช้อินสแตนซ์ Gson เป็นเขตข้อมูลคงที่ใน model bean (นำมาใช้ใหม่) หรือไม่
นี่คือแบบจำลองที่ฉันใช้: public class LoginSession { private static final Gson gson = new Gson(); private String id; private String name; private long timestamp; public LoginSession(String id, String name) { this.id = id; this.name = name; this.timestamp = System.currentTimeMillis(); } public String toJson() { return gson.toJson(this); } public static LoginSession fromJson(String json) …

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