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

การดำเนินการของอะตอมนั้นแบ่งแยกไม่ได้ คำนี้ใช้เพื่ออธิบายธุรกรรมในฐานข้อมูลการเข้าถึงระดับต่ำในโปรแกรมมัลติเธรดและการทำงานของระบบไฟล์และอื่น ๆ

26
อะไรคือความแตกต่างระหว่างแอตทริบิวต์ของอะตอมและไม่ใช่ของอะตอม?
สิ่งใดatomicและมีความnonatomicหมายในการประกาศทรัพย์สิน? @property(nonatomic, retain) UITextField *userName; @property(atomic, retain) UITextField *userName; @property(retain) UITextField *userName; ความแตกต่างในการดำเนินงานระหว่างสามสิ่งนี้คืออะไร

7
อะไรคือความแตกต่างระหว่างอะตอม / ระเหย / ซิงโครไนซ์?
อะตอม / ระเหย / ซิงโครไนซ์ทำงานอย่างไรภายใน ความแตกต่างระหว่างบล็อครหัสต่อไปนี้คืออะไร? รหัส 1 private int counter; public int getNextUniqueIndex() { return counter++; } รหัส 2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } รหัส 3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } ไม่volatileทำงานในลักษณะดังต่อไปนี้หรือไม่? คือ volatile int i = 0; …

6
“ อะตอมมิก” หมายถึงอะไรในการเขียนโปรแกรม
ในหนังสือ Java ที่มีประสิทธิภาพจะระบุ: ข้อกำหนดทางภาษารับประกันว่าการอ่านหรือการเขียนตัวแปรนั้นเป็นอะตอมมิกเว้นแต่ตัวแปรนั้นเป็นประเภทlongหรือdouble[JLS, 17.4.7] "atomic" หมายถึงอะไรในบริบทของการเขียนโปรแกรม Java หรือการเขียนโปรแกรมโดยทั่วไป?
276 java  atomic 


3
std :: atomic คืออะไร?
ฉันเข้าใจว่าstd::atomic<>เป็นวัตถุอะตอม แต่ปรมาณูในระดับใด เพื่อความเข้าใจของฉันการดำเนินการสามารถเป็นอะตอม การทำวัตถุอะตอมหมายถึงอะไรกันแน่? ตัวอย่างเช่นถ้ามีสองกระทู้พร้อมกันรันรหัสต่อไปนี้: a = a + 12; ถ้าอย่างนั้นการปฎิบัติการทั้งหมดadd_twelve_to(int)คืออะไร? หรือมีการเปลี่ยนแปลงกับตัวแปรอะตอม (เช่นoperator=())?

13
num ++ สามารถเป็นอะตอมสำหรับ 'int num' ได้หรือไม่
โดยทั่วไปสำหรับint num, num++(หรือ++num), ในฐานะการดำเนินการอ่าน - แก้ไข - การเขียนไม่ได้เป็นอะตอมมิก แต่ฉันมักจะเห็นคอมไพเลอร์เช่นGCCสร้างรหัสต่อไปนี้ ( ลองที่นี่ ): ตั้งแต่บรรทัดที่ 5 ซึ่งสอดคล้องกับnum++คำสั่งเดียวเราสามารถสรุปได้ว่าnum++ เป็นอะตอมในกรณีนี้หรือไม่? และถ้าเป็นเช่นนั้นหมายความว่าสิ่งที่สร้างขึ้นnum++สามารถนำมาใช้ในสถานการณ์พร้อมกัน (มัลติเธรด) โดยไม่มีอันตรายจากการแข่งขันของข้อมูล (เช่นเราไม่จำเป็นต้องทำตัวอย่างเช่นstd::atomic<int>และกำหนดค่าใช้จ่ายที่เกี่ยวข้องเนื่องจากเป็น ปรมาณูอยู่แล้ว)? UPDATE โปรดสังเกตว่าคำถามนี้ไม่ใช่ว่าการเพิ่มขึ้นเป็นอะตอมหรือไม่ (ไม่ใช่และนั่นคือและเป็นบรรทัดเปิดของคำถาม) มันอาจเป็นได้ในบางสถานการณ์หรือไม่เช่นในกรณีที่ใช้คำสั่งเดียวสามารถใช้เพื่อหลีกเลี่ยงค่าใช้จ่ายของlockคำนำหน้า และในฐานะที่เป็นคำตอบที่ได้รับการยอมรับกล่าวถึงในส่วนที่เกี่ยวกับเครื่องประมวลผลเดียวเช่นเดียวกับคำตอบนี้การสนทนาในความคิดเห็นและอื่น ๆ อธิบายว่ามันสามารถ (แม้ว่าจะไม่ใช่กับ C หรือ C ++)

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 = …

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

6
AtomicInteger lazySet กับ set
อะไรคือความแตกต่างระหว่างlazySetและsetวิธีการAtomicInteger? เอกสารไม่ได้มีมากที่จะพูดเกี่ยวกับlazySet: ในที่สุดก็ตั้งค่าเป็นค่าที่กำหนด ดูเหมือนว่าค่าที่จัดเก็บไว้จะไม่ถูกตั้งค่าเป็นค่าที่ต้องการในทันที แต่จะถูกกำหนดให้ตั้งเวลาในอนาคตแทน แต่การใช้วิธีนี้ในทางปฏิบัติคืออะไร? ตัวอย่างใด
116 java  concurrency  atomic 


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

3
ต้นทุนการดำเนินการของอะตอม
ค่าใช้จ่ายของการดำเนินการของอะตอมคืออะไร (เปรียบเทียบและแลกเปลี่ยนหรือเพิ่ม / ลดอะตอม)? กินรอบเท่าไหร่? มันจะหยุดโปรเซสเซอร์อื่นบน SMP หรือ NUMA หรือจะบล็อกการเข้าถึงหน่วยความจำหรือไม่ จะล้างบัฟเฟอร์เรียงลำดับใหม่ใน CPU ที่ไม่ได้รับคำสั่งหรือไม่? จะมีผลอะไรกับแคชบ้าง? ฉันสนใจซีพียูรุ่นใหม่ยอดนิยม: x86, x86_64, PowerPC, SPARC, Itanium

5
การทำความเข้าใจ std :: atomic :: Compare_exchange_weak () ใน C ++ 11
bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()เป็นหนึ่งในการเปรียบเทียบแบบดั้งเดิมของการแลกเปลี่ยนที่มีให้ใน C ++ 11 มันอ่อนแอexpectedในแง่ที่ว่ามันกลับเท็จแม้ว่ามูลค่าของวัตถุที่มีค่าเท่ากับ นี่เป็นเพราะความล้มเหลวปลอมในบางแพลตฟอร์มที่มีการใช้ลำดับของคำสั่ง (แทนที่จะเป็นหนึ่งใน x86) เพื่อใช้งาน บนแพลตฟอร์มดังกล่าวการสลับบริบทการโหลดที่อยู่เดียวกัน (หรือบรรทัดแคช) ซ้ำโดยเธรดอื่น ฯลฯ อาจทำให้ระบบดั้งเดิมล้มเหลว มันspuriousไม่ใช่ค่าของวัตถุ (ไม่เท่ากับexpected) ที่ทำให้การดำเนินการล้มเหลว แต่มันเป็นปัญหาเรื่องเวลา แต่สิ่งที่ทำให้ฉันไขปริศนาคือสิ่งที่พูดใน C ++ 11 Standard (ISO / IEC 14882) 29.6.5 .. ผลที่ตามมาของความล้มเหลวปลอมคือการใช้การเปรียบเทียบและแลกเปลี่ยนที่อ่อนแอเกือบทั้งหมดจะวนเวียน เหตุใดจึงต้องวนซ้ำในการใช้งานเกือบทั้งหมด ? นั่นหมายความว่าเราจะวนซ้ำเมื่อมันล้มเหลวเพราะความล้มเหลวปลอม ๆ ? ถ้าเป็นเช่นนั้นทำไมเราต้องใช้compare_exchange_weak()และเขียนลูปด้วยตัวเอง? เราสามารถใช้compare_exchange_strong()สิ่งที่ฉันคิดว่าควรกำจัดความล้มเหลวปลอมให้เราได้ อะไรคือกรณีการใช้งานทั่วไปของcompare_exchange_weak()? คำถามอื่นที่เกี่ยวข้อง ในหนังสือของเขา "C ++ Concurrency …

4
วิธีการบรรลุอุปสรรค StoreLoad ใน C ++ 11?
ฉันต้องการเขียนโค้ดแบบพกพา (Intel, ARM, PowerPC ... ) ซึ่งแก้ปัญหาคลาสสิก: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } ซึ่งเป้าหมายคือการหลีกเลี่ยงสถานการณ์ที่หัวข้อทั้งสองจะทำ something(ไม่เป็นไรหากไม่มีสิ่งใดทำงานนี่ไม่ใช่กลไกที่ทำงานเหมือนครั้งเดียว) โปรดแก้ไขให้ฉันถ้าคุณเห็นข้อบกพร่องบางอย่างในการให้เหตุผลด้านล่าง ฉันรู้ว่าฉันสามารถบรรลุเป้าหมายด้วยmemory_order_seq_cstอะตอมstoreและloads ดังต่อไปนี้: std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } ซึ่งบรรลุเป้าหมายเพราะจะต้องมีคำสั่งซื้อทั้งหมดเพียงคำสั่งเดียวใน {x.store(1), y.store(1), y.load(), x.load()}เหตุการณ์ซึ่งจะต้องเห็นด้วยกับ "ขอบ" ของคำสั่งโปรแกรม: x.store(1) …

2
การเริ่มต้นของเวกเตอร์อะตอมมิก
พิจารณา: void foo() { std::vector<std::atomic<int>> foo(10); ... } ตอนนี้เนื้อหาของ foo ใช้ได้หรือไม่ หรือฉันจำเป็นต้องวนซ้ำอย่างชัดเจนและเริ่มต้นได้อย่างไร ฉันได้ตรวจสอบ Godbolt แล้วและดูเหมือนดี แต่มาตรฐานดูเหมือนจะสับสนมากในจุดนี้ ตัวสร้าง:: เวกเตอร์ constructor บอกว่ามันแทรกอินสแตนซ์ที่แทรกค่าเริ่มต้นของstd::atomic<int>ซึ่งเป็นค่าเริ่มต้นผ่านตำแหน่งnewผ่านทางตำแหน่ง ฉันคิดว่าผลของการกำหนดค่าเริ่มต้นนี้ใช้: 2) ถ้า T เป็นประเภทคลาสที่มีคอนสตรัคเตอร์เริ่มต้นที่ไม่ได้จัดเตรียมโดยผู้ใช้หรือลบออก (นั่นคือมันอาจเป็นคลาสที่มีคอนสตรัคเตอร์ปริยายที่กำหนดหรือเป็นค่าปริยาย) วัตถุจะเป็นศูนย์เริ่มต้นแล้ว เริ่มต้นได้เริ่มต้นถ้ามันมีตัวสร้างเริ่มต้นที่ไม่สำคัญ; สำหรับฉันแล้วดูเหมือนว่าอะตอมมิกนั้นถูกกำหนดค่าเริ่มต้นเป็นศูนย์ ดังนั้นคำถามก็คือ a - initialisation ไม่เป็นศูนย์ของstd::atomic<int>ทำให้ผลลัพธ์เป็นวัตถุที่ถูกต้องเป็นศูนย์หรือไม่? ฉันจะเดาว่าคำตอบคือ "ใช่ในทางปฏิบัติ แต่ยังไม่ได้กำหนดจริงๆ"? หมายเหตุ: คำตอบนี้ยอมรับว่ามันเป็นค่าเริ่มต้นเป็นศูนย์ แต่ไม่ได้พูดจริง ๆ ถ้านั่นหมายความว่าวัตถุนั้นถูกต้อง
12 c++  vector  atomic 

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