פונקציות עדכון אטומיות של RenderScript
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
סקירה כללית
כדי לעדכן ערכים ששותפו בין כמה שרשורים, משתמשים בפונקציות הבאות.
הם מוודאים שהערכים מתעדכנים באופן אטומי, כלומר שהקריאות מהזיכרון, העדכונים והכתובות בזיכרון מתבצעים בסדר הנכון.
הפונקציות האלה איטיות יותר מהפונקציות המקבילות שאין להן מאפיין אטומי, לכן כדאי להשתמש בהן רק כשצריך סנכרון.
חשוב לזכור שב-RenderScript, סביר להניח שהקוד יפעל בשרשור נפרד גם אם לא יצרתם אותו באופן מפורש. לרוב, סביבת זמן הריצה של RenderScript תחלק את הביצוע של ליבה אחת לכמה חוטים. צריך לעדכן משתנים גלובליים באמצעות פונקציות אטומיות. אם אפשר, כדאי לשנות את האלגוריתם כדי להימנע מהן לגמרי.
סיכום
פונקציות
rsAtomicAdd
: הוספה ללא סיכון לתאונות בשרשור
פרמטרים
addr | כתובת הערך שרוצים לשנות. |
ערך | הסכום להוספה. |
החזרות
הערך של *addr לפני הפעולה. |
הוספה אטומית של ערך לערך בכתובת addr, כלומר *addr += value
.
rsAtomicAnd
: ביט AND ללא סיכון לתאונות בשרשור
פרמטרים
addr | כתובת הערך שרוצים לשנות. |
ערך | הערך של 'אל' ושל 'עם'. |
החזרות
הערך של *addr לפני הפעולה. |
ביצוע אטומי של ביט-בייט של שני ערכים, ושמירת התוצאה ב-addr, כלומר *addr &= value
.
rsAtomicCas
: השוואה והגדרה ללא סיכון לתאונות בשרשור
פרמטרים
addr | כתובת הערך שיש להשוות אליו ולהחליף אותו אם הבדיקה עוברת. |
compareValue | הערך שיש להשוות אליו את *addr. |
newValue | הערך שרוצים לכתוב אם הבדיקה עוברת. |
החזרות
הערך של *addr לפני הפעולה. |
אם הערך ב-addr תואם ל-compareValue, הערך החדש ייכתב ב-addr, כלומר if (*addr == compareValue) { *addr = newValue; }
.
כדי לבדוק שהערך נכתב, בודקים שהערך המוחזר על ידי rsAtomicCas() הוא compareValue.
rsAtomicDec
: הפחתה בטוחה למשיכות
פרמטרים
addr | הכתובת של הערך שרוצים להקטין. |
החזרות
הערך של *addr לפני הפעולה. |
הפונקציה מחסרת אטומית אחד מהערך ב-addr. זה שווה ערך ל-rsAtomicSub(addr, 1)
.
rsAtomicInc
: הוספה בטוחה למחרוזת
פרמטרים
addr | הכתובת של הערך שרוצים להגדיל. |
החזרות
הערך של *addr לפני הפעולה. |
הוספה אטומית של אחד לערך ב-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
: או בינארי בטוח למחרוזות
פרמטרים
addr | כתובת הערך שרוצים לשנות. |
ערך | הערך של 'אל' או 'עם'. |
החזרות
הערך של *addr לפני הפעולה. |
ביצוע אופרטורים בייטיים של או או על שני ערכים באופן אטומי, ושמירת התוצאה ב-addr, כלומר *addr |= value
.
rsAtomicSub
: חיסור בטוח למספרי תהליכים
פרמטרים
addr | כתובת הערך שרוצים לשנות. |
ערך | הסכום שיש לחסר. |
החזרות
הערך של *addr לפני הפעולה. |
הפונקציה מחסירת באופן אטומי ערך מהערך ב-addr, כלומר *addr -= value
.
rsAtomicXor
: XOR בלעדי ברמת הסיביות ללא סיכון לבעיות בשרשור
פרמטרים
addr | כתובת הערך שרוצים לשנות. |
ערך | הערך שרוצים לבצע איתו XOR. |
החזרות
הערך של *addr לפני הפעולה. |
ביצוע אטומי של XOR בינארי של שני ערכים, ושמירת התוצאה ב-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)."],[],[]]