کتابخانه‌ی استاندارد · زمان و همروندی

اتمی atomic

شمارنده و پرچمی که چند نخ بدون قفل گرفتن دستی می‌توانند با خیال راحت تغییرشان دهند.

واردسازی اتمی
در این صفحه
  1. گونه‌ها
  2. روال‌ها

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

در پیاده‌سازی فعلی هر خانه با یک قفل کوچک محافظت می‌شود؛ پس درست است، ولی از دستورهای اتمی پردازنده سریع‌تر نیست.

گونه‌ها

صحیح۶۴ I64

ساختار صحیح۶۴
یک عدد صحیح ۶۴ بیتی مشترک بین نخ‌ها.
نامانگلیسیگونهتوضیح
cellcellصحیح۶۴*نشانی مقدار.
mumusync.Mutexقفل درونی.
atomic-I64.salam
واردسازی اتمی

ناپایا شمارنده := اتمی.صحیح۶۴ {}

روال کارگر():
    تکرار ۱۰۰۰:
        اتمی.افزودن(شمارنده، ۱)
    پایان
پایان

روال ریشه:
    شمارنده = اتمی.صحیح۶۴ جدید(۰)
    الف := spawn(کارگر)
    ب := spawn(کارگر)
    join(الف)
    join(ب)
    سرچاپ اتمی.بارگذاری(شمارنده)
    اتمی.ذخیره(شمارنده، ۱۰)
    سرچاپ اتمی.تعویض(شمارنده، ۲۰)، اتمی.بارگذاری(شمارنده)
    سرچاپ اتمی.مقایسه سپس تعویض(شمارنده، ۲۰، ۳۰)، اتمی.مقایسه سپس تعویض(شمارنده، ۲۰، ۴۰)، اتمی.بارگذاری(شمارنده)
    اتمی.نابودسازی صحیح۶۴(شمارنده)
    پ := اتمی.پرچم جدید(نادرست)
    سرچاپ اتمی.آزمون سپس تنظیم(پ)، اتمی.آزمون سپس تنظیم(پ)، اتمی.گرفتن(پ)
    اتمی.تنظیم(پ، نادرست)
    سرچاپ اتمی.گرفتن(پ)
    اتمی.نابودسازی پرچم(پ)
پایان
خروجی2000 10 20 true false 30 true false true false

پرچم Flag

ساختار پرچم
یک پرچم درست یا نادرست مشترک بین نخ‌ها.
نامانگلیسیگونهتوضیح
cellcellصحیح۶۴*نشانی مقدار.
mumusync.Mutexقفل درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

روال‌ها

صحیح۶۴ جدید NewI64

روال صحیح۶۴ جدید(v: صحیح۶۴): صحیح۶۴
خانه‌ی تازه با مقدار اولیه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

بارگذاری Load

روال بارگذاری(a: صحیح۶۴): صحیح۶۴
مقدار فعلی را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

ذخیره Store

روال ذخیره(a: صحیح۶۴، v: صحیح۶۴)
مقدار تازه را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

افزودن Add

روال افزودن(a: صحیح۶۴، delta: صحیح۶۴): صحیح۶۴
delta را اضافه می‌کند و مقدار تازه را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

تعویض Swap

روال تعویض(a: صحیح۶۴، v: صحیح۶۴): صحیح۶۴
مقدار تازه را می‌نویسد و مقدار قبلی را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

مقایسه سپس تعویض CompareAndSwap

روال مقایسه سپس تعویض(a: صحیح۶۴، expected: صحیح۶۴، next: صحیح۶۴): منطقی
اگر مقدار فعلی برابر expected باشد، آن را next می‌کند و درست برمی‌گرداند؛ وگرنه دست نمی‌زند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

نابودسازی صحیح۶۴ DestroyI64

روال نابودسازی صحیح۶۴(a: صحیح۶۴)
خانه را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

پرچم جدید NewFlag

روال پرچم جدید(v: منطقی): پرچم
پرچم تازه با مقدار اولیه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

گرفتن Get

روال گرفتن(f: پرچم): منطقی
مقدار پرچم.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

تنظیم Set

روال تنظیم(f: پرچم، v: منطقی)
مقدار پرچم را تعیین می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

آزمون سپس تنظیم TestAndSet

روال آزمون سپس تنظیم(f: پرچم): منطقی
اگر پرچم خاموش باشد، روشنش می‌کند و درست برمی‌گرداند؛ اگر از قبل روشن بوده، نادرست. فقط یک نخ برنده می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam

نابودسازی پرچم DestroyFlag

روال نابودسازی پرچم(f: پرچم)
پرچم را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: atomic-I64.salam