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

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

3
Threadsafe เทียบกับ re-entrant
เมื่อเร็ว ๆ นี้ฉันถามคำถามโดยมีหัวข้อว่า"เธรด Malloc ปลอดภัยหรือไม่" และในนั้นฉันถามว่า "malloc re-entrant หรือไม่" ฉันรู้สึกว่าผู้เข้าใหม่ทั้งหมดปลอดภัยต่อเธรด สมมติฐานนี้ผิดหรือไม่?

3
lock (วัตถุใหม่ ()) - ลัทธิขนส่งสินค้าหรือ "กรณีพิเศษทางภาษา" ที่บ้าคลั่ง?
ฉันกำลังตรวจสอบโค้ดบางส่วนที่เขียนโดยที่ปรึกษาและในขณะที่มีธงสีแดงหลายสิบอันโผล่ขึ้นมาแล้วฉันไม่สามารถคาดเดาข้อมูลโค้ดต่อไปนี้ได้: private void foo() { if (InvokeRequired) { lock (new object()) { if (m_bar!= null) Invoke(new fooDelegate(foo), new object[] { }); } } else { if(OnBazChanged != null) OnBazChanged(); } } lock (วัตถุใหม่ ()) กำลังทำอะไรที่นี่ ไม่ควรมีผลกระทบใด ๆ เนื่องจากมักจะล็อกวัตถุอื่นอยู่เสมอ แต่การล็อกแบบนี้จะคงอยู่ตลอดทั้งรหัสแม้ในส่วนที่ไม่ได้คัดลอกและวาง นี่เป็นกรณีพิเศษบางอย่างในภาษา C # ที่รวบรวมสิ่งที่ฉันไม่รู้หรือโปรแกรมเมอร์เพิ่งนำลัทธิขนส่งสินค้าบางอย่างที่เกิดขึ้นเมื่อไม่นานมานี้มาใช้?

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

3
โปรแกรมมัลติเธรดติดอยู่ในโหมดปรับให้เหมาะสม แต่จะทำงานตามปกติใน -O0
ฉันเขียนโปรแกรมหลายเธรดแบบง่าย ๆ ดังนี้: static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } มันทำงานตามปกติในโหมดดีบั๊กในVisual Studioหรือ-O0ในgc c และพิมพ์ผลหลังจากนั้นไม่1กี่วินาที แต่มันติดอยู่และไม่ได้พิมพ์อะไรในรีลีส-O1 -O2 -O3หรือโหมด

3
“ ความผันผวน” รับประกันอะไรในรหัส C แบบพกพาสำหรับระบบมัลติคอร์หรือไม่?
หลังจากที่กำลังมองหาที่พวง ของ อื่น ๆ คำถาม และ พวกเขา ตอบฉันได้รับความประทับใจที่ไม่มีข้อตกลงอย่างกว้างขวางในสิ่งที่ "ผันผวน" คำหลักใน C หมายความว่า แม้มาตรฐานของตัวเองดูเหมือนจะไม่เพียงพอที่ชัดเจนสำหรับทุกคนที่จะเห็นด้วยกับสิ่งที่มันหมายถึง ท่ามกลางปัญหาอื่น ๆ : ดูเหมือนว่าจะให้การรับประกันที่แตกต่างกันขึ้นอยู่กับฮาร์ดแวร์ของคุณและขึ้นอยู่กับคอมไพเลอร์ของคุณ มันมีผลต่อการปรับให้เหมาะสมของคอมไพเลอร์ แต่ไม่ใช่การปรับให้เหมาะสมของฮาร์ดแวร์ดังนั้นในโปรเซสเซอร์ขั้นสูงที่ทำการปรับแต่งให้เหมาะสมนั้นไม่ชัดเจนว่าคอมไพเลอร์สามารถป้องกันการปรับให้เหมาะสมที่คุณต้องการป้องกันได้หรือไม่ (คอมไพเลอร์บางตัวสร้างคำแนะนำเพื่อป้องกันการปรับแต่งฮาร์ดแวร์บางอย่างในบางระบบ แต่สิ่งนี้ดูเหมือนจะไม่ได้มาตรฐานในทางใดทางหนึ่ง) เพื่อสรุปปัญหาปรากฏขึ้น (หลังจากอ่านมาก) ว่า "volatile" รับประกันสิ่งที่ต้องการ: ค่าจะอ่าน / เขียนไม่เพียงจาก / ไปยังการลงทะเบียน แต่อย่างน้อยกับแคช L1 หลักในลำดับเดียวกันกับที่ การอ่าน / เขียนจะปรากฏขึ้นในรหัส แต่สิ่งนี้ดูไร้ประโยชน์เนื่องจากการอ่าน / เขียนจาก / ไปยังการลงทะเบียนนั้นเพียงพอแล้วในเธรดเดียวกันในขณะที่การประสานงานกับแคช L1 ไม่รับประกันอะไรเพิ่มเติมเกี่ยวกับการประสานงานกับเธรดอื่น ๆ ฉันนึกภาพไม่ออกเลยว่ามันจะสำคัญเมื่อต้องซิงค์เพียงกับแคช L1 ใช้ 1 การใช้ …

2
คัดลอกคอนสตรัคที่มีอาร์กิวเมนต์ที่ไม่ใช่ const แนะนำโดยกฎความปลอดภัยของเธรด?
ฉันมีเสื้อคลุมสำหรับรหัสดั้งเดิมบางส่วน class A{ L* impl_; // the legacy object has to be in the heap, could be also unique_ptr A(A const&) = delete; L* duplicate(){L* ret; legacy_duplicate(impl_, &L); return ret;} ... // proper resource management here }; ในรหัสดั้งเดิมนี้ฟังก์ชั่นที่ "ทำซ้ำ" วัตถุไม่ปลอดภัยเธรด (เมื่อเรียกอาร์กิวเมนต์แรกเดียวกัน) ดังนั้นมันจึงไม่ถูกทำเครื่องหมายconstใน wrapper ฉันเดากฎต่อไปนี้ที่ทันสมัย: https://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ นี้ดูเหมือนจะเป็นวิธีที่ดีที่จะใช้ตัวสร้างสำเนายกเว้นสำหรับรายละเอียดมันที่ไม่ได้เป็นduplicate constดังนั้นฉันไม่สามารถทำสิ่งนี้โดยตรง: class A{ L* …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.