ฟังก์ชันการอัปเดตแบบอะตอมของ RenderScript
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
ภาพรวม
หากต้องการอัปเดตค่าที่แชร์ระหว่างหลายชุดข้อความ ให้ใช้ฟังก์ชันด้านล่าง
ซึ่งจะอัปเดตค่าแบบรวมกัน กล่าวคือ การอ่าน การอัปเดต และการเขียนหน่วยความจำจะทําตามลําดับที่ถูกต้อง
ฟังก์ชันเหล่านี้ทำงานช้ากว่าฟังก์ชันที่ไม่ใช่แบบอะตอม ดังนั้นให้ใช้เฉพาะเมื่อจำเป็นต้องมีการซิงค์
โปรดทราบว่าใน RenderScript โค้ดมีแนวโน้มที่จะทำงานในเธรดแยกต่างหาก แม้ว่าคุณจะไม่ได้สร้างเธรดดังกล่าวอย่างชัดเจนก็ตาม รันไทม์ RenderScript มักจะแยกการดําเนินการของเคิร์กัล 1 รายการออกเป็นหลายเธรด การอัปเดตตัวแปรส่วนกลางควรทําด้วยฟังก์ชันแบบอะตอม หากเป็นไปได้ ให้แก้ไขอัลกอริทึมเพื่อหลีกเลี่ยงการใช้คำเหล่านี้โดยสิ้นเชิง
สรุป
ฟังก์ชัน
rsAtomicAdd
: การเพิ่มที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | จำนวนเงินที่จะเพิ่ม |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
เพิ่มค่าไปยังค่าที่ addr แบบอะตอมิก เช่น *addr += value
rsAtomicAnd
: bitwise and ที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | ค่า "ถึง" และ "ด้วย" |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ดำเนินการ AND แบบบิตต่อ 2 ค่าแบบอะตอม โดยจัดเก็บผลลัพธ์กลับที่ addr นั่นคือ *addr &= value
rsAtomicCas
: การเปรียบเทียบและการตั้งค่าที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะเปรียบเทียบและแทนที่หากการทดสอบผ่าน |
compareValue | ค่าที่จะทดสอบกับ *addr |
newValue | ค่าที่จะเขียนหากการทดสอบผ่าน |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
หากค่าที่ addr ตรงกับ compareValue ระบบจะเขียน newValue ที่ addr นั่นคือ if (*addr == compareValue) { *addr = newValue; }
คุณสามารถตรวจสอบว่าระบบเขียนค่าแล้วโดยดูว่าค่าที่ rsAtomicCas() แสดงผลคือ compareValue
rsAtomicDec
: การลดที่ปลอดภัยสำหรับเธรด
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ลบ 1 จากค่าที่ addr โดยสมบูรณ์ ซึ่งเทียบเท่ากับ rsAtomicSub(addr, 1)
rsAtomicInc
: การเพิ่มขึ้นที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะเพิ่มขึ้น |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
เพิ่ม 1 ลงในค่าที่ addr แบบอะตอม ซึ่งเทียบเท่ากับ rsAtomicAdd(addr, 1)
rsAtomicMax
: หาค่าสูงสุดแบบปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | ค่าเปรียบเทียบ |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
กำหนดค่าที่ addr เป็นค่าสูงสุดของ *addr และ value แบบอะตอม เช่น *addr = max(*addr, value)
rsAtomicMin
: ค่าต่ำสุดที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | ค่าเปรียบเทียบ |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ตั้งค่าที่ addr เป็นค่าต่ำสุดของ *addr และ value แบบอะตอมิก นั่นคือ *addr = min(*addr, value)
rsAtomicOr
: การดำเนินการ OR แบบบิตที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | ค่าสำหรับหรือกับ |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ดำเนินการแบบอะตอมกับค่า 2 ค่าหรือแบบไบนารี โดยจัดเก็บผลลัพธ์ที่ addr นั่นคือ *addr |= value
rsAtomicSub
: การลบที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | จํานวนเงินที่จะหัก |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ลบค่าออกจากค่าที่ addr โดยสมบูรณ์ เช่น *addr -= value
rsAtomicXor
: โอเปอเรเตอร์แบบเฉพาะแบบบิตไวส์ที่ปลอดภัยสำหรับเธรด
พารามิเตอร์
addr | ที่อยู่ของค่าที่จะแก้ไข |
ค่า | ค่าที่จะใช้ XOR ด้วย |
คิกรีเทิร์น
ค่าของ *addr ก่อนการดำเนินการ |
ดำเนินการ XOR แบบบิตต่อค่า 2 ค่าแบบอะตอม โดยจัดเก็บผลลัพธ์ไว้ที่ addr นั่นคือ *addr ^= value
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-02-10 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-02-10 UTC"],[],[]]