ระเหย C++

Rahey C



“นักพัฒนาแอพพลิเคชั่นพื้นที่ผู้ใช้ควรอ้างอิงคู่มือคอมไพเลอร์ที่เกี่ยวข้องเสมอเพื่อเรียนรู้วิธีจัดการกับตัวระบุในบริบทต่างๆ เนื่องจากปกติแล้วพฤติกรรมของคีย์เวิร์ดที่ผันผวนควรถูกมองว่าขึ้นอยู่กับฮาร์ดแวร์ เมื่อวัตถุถูกทำเครื่องหมายเป็นระเหย คอมไพเลอร์มักจะได้รับแจ้งว่าไม่ควรปรับให้เหมาะสมสำหรับการดำเนินการโหลด และควรดึงข้อมูลจากหน่วยความจำหลักเสมอแทนที่จะลงทะเบียนหรือแคช อย่างไรก็ตาม เมื่อคอมไพเลอร์พยายามใส่ตำแหน่งหน่วยความจำลงในรีจิสเตอร์ มันจะถูกแคชโดยอัตโนมัติแม้ว่าจะมีแคชหลายระดับซึ่งส่วนใหญ่ไม่สามารถใช้งานได้กับซอฟต์แวร์และดูแลเฉพาะในฮาร์ดแวร์เท่านั้น เป็นผลให้สามารถเข้าถึง RAM ได้เร็วกว่าจากแคชไลน์ใกล้กับ CPU หลายเท่ามากกว่าจากตำแหน่งหน่วยความจำที่เหมือนกัน

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

อย่างไรก็ตาม การจัดเก็บข้อมูลแบบไม่ลบเลือนจะเก็บข้อมูลแม้ว่าไฟจะดับ ข้อมูลกระบวนการถูกจัดเก็บไว้ชั่วครู่บนพื้นที่จัดเก็บแบบระเหยได้ เนื่องจากเร็วกว่าการจัดเก็บแบบไม่ลบเลือนมาก ต่างจากการจัดเก็บแบบไม่ลบเลือน การจัดเก็บข้อมูลแบบระเหยจะเหมาะสมกว่าในการปกป้องข้อมูลที่ละเอียดอ่อน เนื่องจากไม่สามารถเข้าถึงข้อมูลได้เมื่อปิดเครื่องจ่ายไฟ การจัดเก็บข้อมูลแบบผันผวนมีค่าใช้จ่ายสูงมาก เนื่องจากระบบคอมพิวเตอร์สามารถรองรับได้เพียงไม่กี่ MB ถึงไม่กี่ GB เท่านั้น”







คุณสมบัติของ Volatile Qualifier ใน C++

ตัวระบุ C++ volatile qualifier จะแสดงที่นี่ เมื่อเราประกาศตัวแปร ตัวระบุ 'ระเหย' จะถูกนำไปใช้ มันทำหน้าที่เป็นตัวเตือนให้คอมไพเลอร์ว่าค่านี้อาจเปลี่ยนแปลงได้ตลอดเวลา สารระเหยมีลักษณะบางอย่างตามรายการด้านล่าง



• ไม่สามารถเปลี่ยนการกำหนดหน่วยความจำด้วยคีย์เวิร์ดผันผวน



• ตัวแปรของรีจิสเตอร์ไม่สามารถแคชได้





• ในส่วนของการมอบหมาย ค่าไม่สามารถเปลี่ยนแปลงได้

การใช้ Volatile Qualifier ใน C++

1. แม้ว่าโค้ดของคุณจะไม่แก้ไขค่าของตัวแปร แต่ก็อาจทำได้ ด้วยเหตุนี้ ทุกครั้งที่คอมไพเลอร์ตรวจสอบสถานะของตัวแปร จึงไม่สามารถสรุปได้ว่าเป็นค่าเดียวกับค่าล่าสุดที่อ่านจากตัวแปรหรือค่าล่าสุดที่เก็บไว้ ค่อนข้างจะต้องได้รับค่าของตัวแปรอีกครั้ง



2. คอมไพเลอร์ไม่จำเป็นต้องกำจัดการเก็บค่า เนื่องจากเป็น “ผลข้างเคียง” ที่มองเห็นได้จากภายนอกและเกิดขึ้นเมื่อค่าถูกบันทึกในตัวแปรผันผวน ตัวอย่างเช่น ถ้าวางค่าสองค่าในแถว คอมไพเลอร์ต้องใส่ค่าสองครั้ง

ไวยากรณ์ของ Volatile Qualifier ใน C++

# ระเหย data_type variable_name

ต้องใช้คีย์เวิร์ดระเหยในการประกาศ และชนิดข้อมูลอ้างอิงถึงชนิดข้อมูลใดๆ รวมทั้ง double, float หรือ integer สุดท้าย เราเลือกชื่อสำหรับตัวแปร เราสามารถกำหนดตัวแปรผันผวนโดยใช้วิธีใดวิธีหนึ่งเนื่องจากการประกาศทั้งสองถูกต้อง

ตัวอย่าง: Volatile Qualifier ใช้เพื่อระบุวัตถุที่สามารถแก้ไขได้โดยเธรดอื่นหรือการดำเนินการภายนอกใน C ++

ถ้าวัตถุถูกเปลี่ยนโดยสัญญาณภายนอกหรือขั้นตอนที่ทำหน้าที่เป็นอินเตอร์รัปต์ ค่าที่เปลี่ยนแปลงจะต้องถูกดึงมาจาก RAM เนื่องจากสถานะแคชไม่เหมาะสมอีกต่อไปในระหว่างนี้ เป็นผลให้คอมไพเลอร์จัดการการเข้าถึงวัตถุระเหยได้อย่างเหมาะสม

#include
#include
#include

ใช้ std :: ศาล ;
ใช้ std :: endl ;
ใช้ std :: cerr ;
ใช้ std :: การกิน ;

ระเหย int วินาที = 0 ;

โมฆะ DelayFiveSeconds ( ) {
ในขณะที่ ( วินาที < 3 ) {
นอนหลับ ( 20000 ) ;
cerr << 'การรอคอย...' << endl ;
}
}

โมฆะ เพิ่มวินาที ( ) {
สำหรับ ( int ผม = 0 ; ผม < 5 ; ++ ผม ) {
นอน ( 1 ) ;
cerr << 'เพิ่มขึ้น' << endl ;
วินาที = วินาที + 1 ;
}
}

int หลัก ( ) {
โครงสร้าง ช่วงเวลาเริ่มต้น { } ;
โครงสร้าง สิ้นสุดระยะเวลา { } ;
มาตรฐาน :: เกลียว เธรด1 ;

เธรด1 = มาตรฐาน :: เกลียว ( เพิ่มวินาที ) ;

DelayFiveSeconds ( ) ;

เธรด1. เข้าร่วม ( ) ;
กลับ EXIT_SUCCESS ;
}


เพื่อแสดงสถานการณ์ที่อาจเกิดขึ้น เราได้ใช้คำหลักผันผวนที่มีการประกาศตัวแปรเป็นวินาทีของประเภทข้อมูล 'int' และกำหนดค่าเป็น 0 ให้กับมัน จากนั้น เราสร้างสองฟังก์ชัน: ฟังก์ชันหนึ่งเป็น 'DelayFiveSeconds' ที่เปลี่ยนตัวแปรจำนวนเต็มผันผวนทั่วโลก และอีกฟังก์ชันหนึ่งเป็น 'IncrementSeconds' ที่ทำการประเมินเดียวกันภายในลูป while ควรสังเกตว่าตัวอย่างนี้อนุญาตให้ลูป while วนซ้ำในวินาทีที่วินาทีควรน้อยกว่า 3

เมื่อตรงตามเงื่อนไข บล็อก while จะถูกดำเนินการ ภายในบล็อก while เราได้เรียกใช้เมธอด unsleep ที่พิมพ์ข้อความว่า 'รอ' ฟังก์ชัน 'IncrementSceonds' มีลูป for หลังจากการวนซ้ำ วิธีการสลีปจะถูกเรียกใช้ ซึ่งจะพิมพ์คำสั่ง 'เพิ่มขึ้น' และเพิ่มตัวแปร 'วินาที' การดำเนินการเริ่มต้นของฟังก์ชัน 'IncrementSeconds' ทำได้โดยเธรดแยกต่างหากที่สร้างโดยฟังก์ชันหลัก จากนั้นเธรดหลักจะเรียกเมธอด “DelayFiveSeconds” โดยเข้าสู่ลูปที่จะไม่สิ้นสุดหากตัวแปรวินาทีไม่สูงกว่าค่า 5

ทันทีที่เธรดหลักสังเกตเห็นว่าค่าของตัวแปร seconds เปลี่ยนไป มันจะคืนค่าจากเมธอดนั้น เนื่องจากเธรดอื่นได้เริ่มเพิ่มขึ้นพร้อมกันแล้ว

ในการรันโค้ดเธรดใน C++ เราควรใช้คำสั่ง “g++ -pthread –o filename filename.cc” หากคุณไม่ปรับใช้ '-pthread' ในคำสั่ง คอมไพเลอร์ก็อาจมีข้อยกเว้น ด้วยเหตุนี้ เราจึงสร้างฟังก์ชันรอแบบมีเงื่อนไขที่รอจนกระทั่งวัตถุระเหยถูกเปลี่ยนโดยแรงภายนอก สิ่งสำคัญที่ต้องจำไว้คือบล็อกรหัสการอัพเดทอาจมาจากส่วนการแปลอื่นหรือการทำงานของสัญญาณภายนอก แม้ว่ารหัสนี้จะยังคงทำงานเหมือนเดิมหากตัวระบุที่ระเหยถูกลบออกและใช้ตัวแปรส่วนกลางทั่วไป

บทสรุป

ในที่นี้ เราจะพูดถึงภาพรวมของ Volatile ใน C++ พร้อมกับไวยากรณ์ การใช้งาน และตัวอย่างที่เหมาะสมเพื่อความเข้าใจที่ดีขึ้น เนื่องจากคอมไพเลอร์ไม่สามารถทำนายค่าได้ ความผันผวนจึงเป็นสิ่งสำคัญในการเขียนโปรแกรมภาษาซี ประโยชน์หลักของการใช้ความผันผวนคือค่าของมันอาจแตกต่างกันไปเมื่อใดก็ตามที่ผู้ใช้ร้องขอให้แก้ไขหรือเมื่อมีการใช้งานเธรดอื่นที่ใช้ตัวแปรเดียวกัน