اتمی atomic
شمارنده و پرچمی که چند نخ بدون قفل گرفتن دستی میتوانند با خیال راحت تغییرشان دهند.
واردسازی اتمی
برای یک شمارندهی ساده که چند نخ زیادش میکنند، لازم نیست خودتان قفل بسازید: صحیح۶۴ در این بسته هر کار را یکجا و بدون تداخل انجام میدهد. مقایسه سپس تعویض پایهی بیشتر الگوریتمهای بدون قفل است: مقدار را فقط اگر هنوز همانی باشد که انتظار دارید عوض میکند.
در پیادهسازی فعلی هر خانه با یک قفل کوچک محافظت میشود؛ پس درست است، ولی از دستورهای اتمی پردازنده سریعتر نیست.
گونهها
صحیح۶۴ I64
ساختار صحیح۶۴| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| cell | cell | صحیح۶۴* | نشانی مقدار. |
| mu | mu | sync.Mutex | قفل درونی. |
واردسازی اتمی
ناپایا شمارنده := اتمی.صحیح۶۴ {}
روال کارگر():
تکرار ۱۰۰۰:
اتمی.افزودن(شمارنده، ۱)
پایان
پایان
روال ریشه:
شمارنده = اتمی.صحیح۶۴ جدید(۰)
الف := spawn(کارگر)
ب := spawn(کارگر)
join(الف)
join(ب)
سرچاپ اتمی.بارگذاری(شمارنده)
اتمی.ذخیره(شمارنده، ۱۰)
سرچاپ اتمی.تعویض(شمارنده، ۲۰)، اتمی.بارگذاری(شمارنده)
سرچاپ اتمی.مقایسه سپس تعویض(شمارنده، ۲۰، ۳۰)، اتمی.مقایسه سپس تعویض(شمارنده، ۲۰، ۴۰)، اتمی.بارگذاری(شمارنده)
اتمی.نابودسازی صحیح۶۴(شمارنده)
پ := اتمی.پرچم جدید(نادرست)
سرچاپ اتمی.آزمون سپس تنظیم(پ)، اتمی.آزمون سپس تنظیم(پ)، اتمی.گرفتن(پ)
اتمی.تنظیم(پ، نادرست)
سرچاپ اتمی.گرفتن(پ)
اتمی.نابودسازی پرچم(پ)
پایانپرچم Flag
ساختار پرچم| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| cell | cell | صحیح۶۴* | نشانی مقدار. |
| mu | mu | sync.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