คำถามติดแท็ก memory-model

8
C ++ 11 แนะนำรุ่นหน่วยความจำที่ได้มาตรฐาน มันหมายความว่าอะไร? แล้วมันจะมีผลกับการเขียนโปรแกรม C ++ อย่างไร?
C ++ 11 นำเสนอโมเดลหน่วยความจำที่ได้มาตรฐาน แต่นั่นหมายความว่าอย่างไร แล้วมันจะมีผลกับการเขียนโปรแกรม C ++ อย่างไร? บทความนี้ (โดยกาวินคล๊าร์คซึ่งเป็นผู้เสนอราคาHerb Sutter ) กล่าวว่า รุ่นหน่วยความจำหมายความว่าตอนนี้รหัส C ++ มีไลบรารีมาตรฐานที่จะเรียกโดยไม่คำนึงว่าใครเป็นผู้สร้างคอมไพเลอร์และแพลตฟอร์มใดที่ทำงานอยู่ มีวิธีมาตรฐานในการควบคุมว่าเธรดที่แตกต่างพูดคุยกับหน่วยความจำของโปรเซสเซอร์ได้อย่างไร “ เมื่อคุณกำลังพูดถึงการแยก [รหัส] ข้ามคอร์ต่าง ๆ ที่อยู่ในมาตรฐานเรากำลังพูดถึงโมเดลหน่วยความจำเราจะเพิ่มประสิทธิภาพโดยไม่ทำลายสมมติฐานต่อไปนี้ที่ผู้คนจะทำในรหัส” ซัทเทอร์กล่าว ฉันสามารถจดจำย่อหน้านี้และย่อหน้าที่คล้ายกันได้ทางออนไลน์ (เนื่องจากฉันมีโมเดลความจำของตัวเองตั้งแต่แรกเกิด: P) และยังสามารถโพสต์เป็นคำตอบสำหรับคำถามที่ถามโดยคนอื่น ๆ แต่จริงๆแล้วฉันไม่เข้าใจเลย นี้. โปรแกรมเมอร์ C ++ เคยพัฒนาแอพพลิเคชั่นแบบมัลติเธรดมาก่อนดังนั้นมันจะสำคัญอย่างไรถ้าเป็นเธรด POSIX หรือเธรด Windows หรือเธรด C ++ 11 ประโยชน์คืออะไร ฉันต้องการที่จะเข้าใจรายละเอียดในระดับต่ำ ฉันรู้สึกเช่นนี้ด้วยว่ารูปแบบหน่วยความจำ C ++ 11 …

3
C มีค่า std :: น้อยกว่าจาก C ++ หรือไม่
ฉันเพิ่งตอบคำถามเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนดของการทำp < qใน C เมื่อpและqเป็นตัวชี้ไปยังวัตถุ / อาร์เรย์ที่แตกต่างกัน นั่นทำให้ฉันคิดว่า: C ++ มีพฤติกรรมเหมือนกัน (ไม่ได้กำหนด) <ในกรณีนี้ แต่ยังมีเท็มเพลตไลบรารีมาตรฐานstd::lessซึ่งรับประกันว่าจะส่งคืนสิ่งเดียวกันกับ<ที่สามารถเปรียบเทียบตัวชี้และส่งคืนการสั่งซื้อบางอย่างที่ไม่สอดคล้อง C เสนอบางสิ่งที่มีฟังก์ชั่นคล้ายกันซึ่งจะช่วยให้เปรียบเทียบตัวชี้ตามอำเภอใจ (กับประเภทเดียวกัน) ได้อย่างปลอดภัยหรือไม่? ฉันพยายามมองผ่านมาตรฐาน C11 และไม่พบอะไรเลย แต่ประสบการณ์ของฉันใน C คือขนาดที่เล็กกว่า C ++ ดังนั้นฉันอาจจะพลาดอะไรบางอย่างได้อย่างง่ายดาย

1
กรอบหน่วยความจำใช้ใน Java อะไร
ขณะที่พยายามที่จะเข้าใจว่าSubmissionPublisher( รหัสแหล่งที่มาใน Java SE 10 OpenJDK | เอกสาร ), คลาสใหม่เพิ่มเข้ามาใน Java SE ในรุ่นที่ 9 ได้รับการดำเนินฉัน stumbled ข้าม API โทรไม่กี่คนที่VarHandleฉันไม่ได้ก่อนหน้านี้ตระหนักถึง: fullFence, acquireFence, releaseFence, และloadLoadFencestoreStoreFence หลังจากทำวิจัยโดยเฉพาะอย่างยิ่งเกี่ยวกับแนวคิดของอุปสรรคหน่วยความจำ / รั้ว (ฉันเคยได้ยินพวกเขาก่อนหน้านี้ใช่ แต่ไม่เคยใช้พวกเขาจึงค่อนข้างไม่คุ้นเคยกับความหมายของพวกเขา) ฉันคิดว่าฉันมีความเข้าใจพื้นฐานของสิ่งที่พวกเขา . อย่างไรก็ตามเนื่องจากคำถามของฉันอาจเกิดขึ้นจากการเข้าใจผิดฉันต้องการให้แน่ใจว่าฉันได้รับมันตั้งแต่แรก: อุปสรรคหน่วยความจำกำลัง จำกัด ข้อ จำกัด ใหม่เกี่ยวกับการอ่านและการเขียน อุปสรรคหน่วยความจำสามารถแบ่งออกเป็นสองประเภทหลัก: อุปสรรคหน่วยความจำทิศทางเดียวและแบบสองทิศทางขึ้นอยู่กับว่าพวกเขาตั้งข้อ จำกัด ในการอ่านหรือเขียนหรือทั้งสองอย่าง c ++ สนับสนุนความหลากหลายของปัญหาและอุปสรรคที่หน่วยความจำVarHandleแต่เหล่านี้ไม่ตรงกับผู้ที่ให้บริการโดย แต่บางส่วนของปัญหาและอุปสรรคที่หน่วยความจำที่มีอยู่ในVarHandleให้ผลกระทบการสั่งซื้อที่มีเข้ากันได้จะสอดคล้อง c ++ อุปสรรคหน่วยความจำของพวกเขา #fullFence เข้ากันได้กับ atomic_thread_fence(memory_order_seq_cst) …

1
C11 Atomic Acquire / Release และ x86_64 ขาดการเชื่อมโยงโหลด / จัดเก็บ?
ฉันกำลังดิ้นรนกับมาตรา 5.1.2.4 ของมาตรฐาน C11 โดยเฉพาะความหมายของการเปิดตัว / การได้มา ฉันทราบว่าhttps://preshing.com/20120913/acquire-and-release-semantics/ (ในจำนวนอื่น ๆ ) ระบุว่า: ... ความหมายของการวางจำหน่ายป้องกันการเรียงลำดับหน่วยความจำของการปล่อยการเขียนด้วยการดำเนินการอ่านหรือการเขียนที่นำหน้ามันตามลำดับของโปรแกรม ดังนั้นสำหรับต่อไปนี้: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts->v1 = v1 ; ts->v2 = v2 ; atomic_store_explicit(&ts->ready, false, …

1
“ เกิดขึ้นก่อนหน้านี้” หมายความว่าอะไร?
วลี "เกิดขึ้นอย่างแรงก่อน" ถูกใช้หลายครั้งในมาตรฐานฉบับร่าง C ++ ตัวอย่างเช่น: การยุติ [basic.start.term] / 5 หากความสมบูรณ์ของการเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่เกิดขึ้นก่อนที่จะเรียก std :: atexit (ดู, [support.start.term]) การเรียกฟังก์ชั่นผ่านไปยัง std :: atexit ถูกจัดลำดับก่อนการเรียกไปยัง destructor สำหรับวัตถุ ถ้าการเรียกไปยัง std :: atexit เกิดขึ้นอย่างมากก่อนที่การเริ่มต้นของวัตถุที่มีระยะเวลาการจัดเก็บแบบสแตติกการเรียกไปยัง destructor สำหรับวัตถุนั้นจะถูกจัดลำดับก่อนที่การเรียกไปยังฟังก์ชันที่ส่งผ่านไปยัง std :: atexit . หากการเรียกไปยัง std :: atexit เกิดขึ้นอย่างยิ่งก่อนการเรียกไปยัง std :: atexit การเรียกใช้ฟังก์ชันที่ส่งไปยังการเรียก std :: atexit ที่สองจะถูกจัดลำดับก่อนการเรียกไปยังฟังก์ชันที่ส่งไปยัง first std :: …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.