استفاده از Atomics.and در جاوا اسکریپت

javascript atomics and usage
20 آبان 1403

مقدمه‌ای به Atomics و ویژگی آن در جاوا اسکریپت

جاوا اسکریپت به عنوان زبانی که معمولاً در محیط‌های تک‌نخی (Single-threaded) استفاده می‌شود، محدودیت‌هایی در مدیریت منابع هم‌زمان در دو یا چند نخ داشته است. با معرفی ویژگی Atomics، کنترل و هماهنگی عملیات هم‌زمان در آرایه‌های اشتراکی آسان‌تر شده است.

ویژگی Atomics برای دستیابی به هم‌زمانی ایمن میان نخ‌های مختلف در سیستم‌هایی که از SharedArrayBuffer استفاده می‌کنند، به کار گرفته می‌شود. این ویژگی به ویژه در برنامه‌نویسی پیشرفته و بهینه‌سازی عملکرد برنامه‌ها در سیستم‌های چند‌هسته‌ای مفید است.

عملگر Atomics.and چیست؟

کاربرد Atomics.and این است که عملگر بیتی AND روی یک مقدار در محل خاص از یک SharedArrayBuffer پیاده می‌کند. این امر به شما اجازه می‌دهد تا به صورت اتمیک و ایمن محاسبات بیتی AND را انجام دهید.

به عنوان نمونه، فرض کنید دو نخ به طور همزمان در حال دسترسی و به روز رسانی یک مقدار در حافظه مشترک هستند. استفاده از Atomics.and تضمین می‌کند که این عملیات به صورت اتمیک انجام شود، یعنی نتیجه صحیح عملیات بدون هیچ اختلالی مقدار بروز شده را دریافت خواهد کرد.

در زیر به کد نمونه‌ای خواهیم پرداخت که کاربرد این عملگر را نشان می‌دهد.


let sharedBuffer = new SharedArrayBuffer(1024);  // ایجاد بافر مشترک
let sharedArray = new Uint8Array(sharedBuffer);  // ایجاد آرایه از نوع صحیح بدون علامت
sharedArray[0] = 15;
console.log(`قبل از Atomics.and: ${sharedArray[0]}`);  // نمایش مقدار اولیه
Atomics.and(sharedArray, 0, 7);  // اجرای عملیات بیتی AND با مقدار 7
console.log(`بعد از Atomics.and: ${sharedArray[0]}`);  // نمایش مقدار جدید

در مثال بالا، ابتدا یک SharedArrayBuffer جدید با طول 1024 بایت ایجاد می‌کنیم و سپس یک Uint8Array برای دسترسی به آن ایجاد کرده‌ایم.

در خط سوم، مقدار اولیه عنصر اول آرایه را به 15 تنظیم می‌کنیم.

در مرحله بعد، با استفاده از Atomics.and و مقدار 7، عملگر بیتی AND را روی اولین عنصر آرایه اعمال می‌کنیم.

در نتیجه، مقدار جدید عنصر برابر 15 ∧ 7 خواهد بود. در پیام نهایی نیز نتیجه این عملیات مشاهده می‌شود.

سوالات متداول

؟

Atomics.and به چه صورت کار می‌کند؟

؟

چرا باید از Atomics استفاده کنیم؟

؟

چه تفاوتی بین Uint8Array و SharedArrayBuffer وجود دارد؟