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