همگام سازی sync
قفل، متغیر شرط، گروه انتظار، قفل خواندن و نوشتن، نشانگر و «یک بار» برای هماهنگ کردن نخها.
واردسازی همگام سازی
وقتی چند نخ یک متغیر را تغییر میدهند، باید نوبت را رعایت کنند؛ وگرنه نتیجه به ترتیب تصادفی اجرای نخها بستگی پیدا میکند. قفل سادهترین راه است: هر نخ پیش از دست زدن به داده قفل را میگیرد و پس از آن باز میکند.
گروه انتظار برای منتظر ماندن تا پایان چند کار است: پیش از راه انداختن کارها افزودن را صدا بزنید، هر کار در پایان اتمام را، و نخ اصلی انتظار را. هر ابزار این بسته با یک روال ...جدید ساخته و با نابودسازی آزاد میشود.
گونهها
قفل Mutex
ساختار قفل| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| handle | handle | تهی* | قفل سیستمعامل. |
واردسازی همگام سازی
ناپایا موجودی := ۰
ناپایا قفل := همگام سازی.قفل {}
ناپایا گروه := همگام سازی.گروه انتظار {}
روال واریز():
تکرار ۵۰۰:
همگام سازی.قفل کردن(قفل)
موجودی += ۱
همگام سازی.باز کردن قفل(قفل)
پایان
همگام سازی.اتمام(گروه)
پایان
روال ریشه:
قفل = همگام سازی.قفل جدید()
گروه = همگام سازی.گروه انتظار جدید()
همگام سازی.انتظار(گروه)
همگام سازی.افزودن(گروه، ۴)
الف := spawn(واریز)
ب := spawn(واریز)
ج := spawn(واریز)
د := spawn(واریز)
همگام سازی.انتظار(گروه)
join(الف)
join(ب)
join(ج)
join(د)
سرچاپ "موجودی:"، موجودی
همگام سازی.نابودسازی گروه انتظار(گروه)
همگام سازی.نابودسازی(قفل)
پایانمتغیر شرط CondVar
ساختار متغیر شرط| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| handle | handle | تهی* | متغیر شرط سیستمعامل. |
واردسازی همگام سازی
ناپایا آماده := نادرست
ناپایا قفل := همگام سازی.قفل {}
ناپایا شرط := همگام سازی.متغیر شرط {}
روال سازنده():
همگام سازی.خواب میلی ثانیه(۲۰)
همگام سازی.قفل کردن(قفل)
آماده = درست
همگام سازی.اعلام سراسری(شرط)
همگام سازی.باز کردن قفل(قفل)
پایان
روال ریشه:
قفل = همگام سازی.قفل جدید()
شرط = همگام سازی.متغیر شرط جدید()
آغاز := همگام سازی.اکنون میلی ثانیه()
همگام سازی.قفل کردن(قفل)
سرچاپ همگام سازی.انتظار شرط با مهلت(شرط، قفل، ۱۰)
ن := spawn(سازنده)
تا وارونه آماده:
همگام سازی.انتظار شرط(شرط، قفل)
پایان
همگام سازی.باز کردن قفل(قفل)
join(ن)
سرچاپ آماده، همگام سازی.اکنون میلی ثانیه() - آغاز >= ۲۰
همگام سازی.اعلام(شرط)
همگام سازی.نابودسازی متغیر شرط(شرط)
همگام سازی.نابودسازی(قفل)
پایانگروه انتظار WaitGroup
ساختار گروه انتظار| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| counter | counter | صحیح۶۴* | شمار کارهای ناتمام. |
| mu | mu | تهی* | قفل درونی. |
| cv | cv | تهی* | متغیر شرط درونی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
قفل خواندن نوشتن RWMutex
ساختار قفل خواندن نوشتن| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| state | state | صحیح۶۴* | وضعیت درونی: خوانندهها، نویسنده و نویسندههای منتظر. |
| mu | mu | تهی* | قفل درونی. |
| cv | cv | تهی* | متغیر شرط درونی. |
واردسازی همگام سازی
روال ریشه:
ق := همگام سازی.قفل خواندن نوشتن جدید()
همگام سازی.قفل خواندن(ق)
همگام سازی.قفل خواندن(ق)
سرچاپ "دو خواننده با هم"
همگام سازی.باز کردن قفل خواندن(ق)
همگام سازی.باز کردن قفل خواندن(ق)
همگام سازی.قفل نوشتن(ق)
سرچاپ "یک نویسنده بهتنهایی"
همگام سازی.باز کردن قفل نوشتن(ق)
همگام سازی.نابودسازی قفل خواندن نوشتن(ق)
ن := همگام سازی.نشانگر جدید(۲)
همگام سازی.گرفتن(ن)
سرچاپ همگام سازی.تلاش برای گرفتن(ن)، همگام سازی.تلاش برای گرفتن(ن)
همگام سازی.رها کردن(ن)
سرچاپ همگام سازی.تلاش برای گرفتن(ن)
همگام سازی.نابودسازی نشانگر(ن)
ی := همگام سازی.یک بار جدید()
تکرار ۳:
همگام سازی.انجام(ی، (): سرچاپ "فقط یک بار" پایان)
پایان
همگام سازی.نابودسازی یک بار(ی)
پایاننشانگر Semaphore
ساختار نشانگر| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| permits | permits | صحیح۶۴* | شمار مجوزهای آزاد. |
| mu | mu | تهی* | قفل درونی. |
| cv | cv | تهی* | متغیر شرط درونی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
یک بار Once
ساختار یک بار| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| done | done | صحیح۶۴* | آیا روال اجرا شده. |
| mu | mu | تهی* | قفل درونی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
روالها
قفل جدید NewMutex
روال قفل جدید(): قفلنمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
قفل کردن Lock
روال قفل کردن(m: قفل): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
باز کردن قفل Unlock
روال باز کردن قفل(m: قفل): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
نابودسازی Destroy
روال نابودسازی(m: قفل)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
خواب میلی ثانیه SleepMs
روال خواب میلی ثانیه(ms: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
متغیر شرط جدید NewCondVar
روال متغیر شرط جدید(): متغیر شرطنمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
انتظار شرط WaitCond
روال انتظار شرط(cv: متغیر شرط، m: قفل)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
انتظار شرط با مهلت WaitCondTimeout
روال انتظار شرط با مهلت(cv: متغیر شرط، m: قفل، ms: صحیح۶۴): منطقیانتظار شرط، ولی حداکثر تا ms میلیثانیه. اگر زمان تمام شود، نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
اکنون میلی ثانیه NowMs
روال اکنون میلی ثانیه(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
اعلام Signal
روال اعلام(cv: متغیر شرط)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
اعلام سراسری Broadcast
روال اعلام سراسری(cv: متغیر شرط)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
نابودسازی متغیر شرط DestroyCondVar
روال نابودسازی متغیر شرط(cv: متغیر شرط)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-CondVar.salam
گروه انتظار جدید NewWaitGroup
روال گروه انتظار جدید(): گروه انتظارنمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
افزودن Add
روال افزودن(wg: گروه انتظار، delta: صحیح۶۴)delta تا زیاد میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
اتمام Done
روال اتمام(wg: گروه انتظار)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
انتظار Wait
روال انتظار(wg: گروه انتظار)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
نابودسازی گروه انتظار DestroyWaitGroup
روال نابودسازی گروه انتظار(wg: گروه انتظار)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-Mutex.salam
قفل خواندن نوشتن جدید NewRWMutex
روال قفل خواندن نوشتن جدید(): قفل خواندن نوشتننمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
قفل خواندن RLock
روال قفل خواندن(rw: قفل خواندن نوشتن)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
باز کردن قفل خواندن RUnlock
روال باز کردن قفل خواندن(rw: قفل خواندن نوشتن)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
قفل نوشتن WLock
روال قفل نوشتن(rw: قفل خواندن نوشتن)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
باز کردن قفل نوشتن WUnlock
روال باز کردن قفل نوشتن(rw: قفل خواندن نوشتن)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
نابودسازی قفل خواندن نوشتن DestroyRWMutex
روال نابودسازی قفل خواندن نوشتن(rw: قفل خواندن نوشتن)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
نشانگر جدید NewSemaphore
روال نشانگر جدید(permits: صحیح۶۴): نشانگرنمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
گرفتن Acquire
روال گرفتن(sem: نشانگر)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
تلاش برای گرفتن TryAcquire
روال تلاش برای گرفتن(sem: نشانگر): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
رها کردن Release
روال رها کردن(sem: نشانگر)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
نابودسازی نشانگر DestroySemaphore
روال نابودسازی نشانگر(sem: نشانگر)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
یک بار جدید NewOnce
روال یک بار جدید(): یک بارنمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
انجام Do
روال انجام(o: یک بار، f: روال())نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam
نابودسازی یک بار DestroyOnce
روال نابودسازی یک بار(o: یک بار)نمونهی این مورد همراه با موارد بالاتر آمده است: sync-RWMutex.salam