آشنایی با Atomics.exchange در جاوااسکریپت
در برنامهنویسی مدرن، یکی از چالشهای بزرگ کاهش خطاهای همزمانی (Concurrency) است. Atomics.exchange یکی از ابزارهای قدرتمند در جاوااسکریپت به شمار میرود که به ما امکان میدهد مقادیر متغیرهای مشترک را به صورت ایمن تغییر دهیم. این تابع به ما اجازه میدهد که مقداری را به متغیر دادهای که یک نوع TypedArray است، اختصاص دهیم و در عوض مقداری قبلی آن متغیر را بگیریم. این کار به ما کمک میکند تا از دسترسی همزمان عدهای به یک متغیر جلوگیری کنیم.
استفاده از Atomics.exchange در برنامهنویسی ماشینی و در حالتی که نیاز به پردازش موازی داریم، اهمیت پیدا میکند. به عنوان مثال، فرض کنید چند نخ (threads) در حال دسترسی به یک متغیر مشترک هستند و ما قصد داریم یکی از این نخها مقدار آن را تغییر دهد. با استفاده از Atomics، از بروز مشکلاتی مثل race conditions جلوگیری میکنیم. به این ترتیب، این تابع میتواند به ما در مدیریت بهینهی عملکرد و جلوگیری از خطاهای منطقی کمک کند.
یکی دیگر از ویژگیهای Atomics.exchange این است که این تابع به ما امکان میدهد به صورت اتمی (atomic) تغییرات را اعمال کنیم. اتمی به معنای ناپیدا بودن تغییر است که به ما اطمینان میدهد در هنگام تغییر مقدار، دیگر نخها دسترسی به آن نخواهند داشت. این ویژگی بسیار مهم است، به خصوص در برنامههایی که نیاز به پایداری دارند.
نحوه استفاده از Atomics.exchange
در اینجا مثالی از نحوه استفاده از Atomics.exchange برای شما ارائه میدهیم تا بهتر با این مفهوم آشنا شوید. فرض کنید یک آرایهی TypedArray داریم و میخواهیم مقداری را در آن تغییر دهیم:
const sharedBuffer = new SharedArrayBuffer(4);
const int32Array = new Int32Array(sharedBuffer);
// تغییر مقدار در ایندکس 0
const oldValue = Atomics.exchange(int32Array, 0, 42);
console.log(oldValue); // نمایش مقدار قبلی
console.log(int32Array[0]); // نمایش مقدار جدید
توضیحات کد
const sharedBuffer = new SharedArrayBuffer(4);
با استفاده از این خط، یک بافر مشترک (SharedArrayBuffer) با سایز ۴ بایتی ایجاد میشود.
const int32Array = new Int32Array(sharedBuffer);
در اینجا، یک آرایه از نوع Int32Array با استفاده از بافر مشترک ایجاد میکنیم. این آرایه میتواند مقادیر عددی ۳۲ بیتی را ذخیره کند.
const oldValue = Atomics.exchange(int32Array, 0, 42);
با استفاده از Atomics.exchange، مقدار ۴۲ به ایندکس ۰ آرایه نسبت داده میشود و مقدار قبلی آن ایندکس در متغیر oldValue ذخیره میشود.
console.log(oldValue);
در این مرحله، مقدار قبلی که در ایندکس ۰ وجود داشت را چاپ میکنیم.
console.log(int32Array[0]);
در نهایت، مقدار جدیدی که اکنون در ایندکس ۰ آرایه وجود دارد، چاپ میشود.