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

همگام سازی sync

قفل، متغیر شرط، گروه انتظار، قفل خواندن و نوشتن، نشانگر و «یک بار» برای هماهنگ کردن نخ‌ها.

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

وقتی چند نخ یک متغیر را تغییر می‌دهند، باید نوبت را رعایت کنند؛ وگرنه نتیجه به ترتیب تصادفی اجرای نخ‌ها بستگی پیدا می‌کند. قفل ساده‌ترین راه است: هر نخ پیش از دست زدن به داده قفل را می‌گیرد و پس از آن باز می‌کند.

گروه انتظار برای منتظر ماندن تا پایان چند کار است: پیش از راه انداختن کارها افزودن را صدا بزنید، هر کار در پایان اتمام را، و نخ اصلی انتظار را. هر ابزار این بسته با یک روال ...جدید ساخته و با نابودسازی آزاد می‌شود.

گونه‌ها

قفل Mutex

ساختار قفل
قفل؛ در هر لحظه فقط یک نخ آن را در دست دارد.
نامانگلیسیگونهتوضیح
handlehandleتهی*قفل سیستم‌عامل.
sync-Mutex.salam
واردسازی همگام سازی

ناپایا موجودی := ۰
ناپایا قفل := همگام سازی.قفل {}
ناپایا گروه := همگام سازی.گروه انتظار {}

روال واریز():
    تکرار ۵۰۰:
        همگام سازی.قفل کردن(قفل)
        موجودی += ۱
        همگام سازی.باز کردن قفل(قفل)
    پایان
    همگام سازی.اتمام(گروه)
پایان

روال ریشه:
    قفل = همگام سازی.قفل جدید()
    گروه = همگام سازی.گروه انتظار جدید()
    همگام سازی.انتظار(گروه)
    همگام سازی.افزودن(گروه، ۴)
    الف := spawn(واریز)
    ب := spawn(واریز)
    ج := spawn(واریز)
    د := spawn(واریز)
    همگام سازی.انتظار(گروه)
    join(الف)
    join(ب)
    join(ج)
    join(د)
    سرچاپ "موجودی:"، موجودی
    همگام سازی.نابودسازی گروه انتظار(گروه)
    همگام سازی.نابودسازی(قفل)
پایان
خروجیموجودی: 2000

متغیر شرط CondVar

ساختار متغیر شرط
متغیر شرط: نخ‌ها روی آن می‌خوابند تا نخ دیگری خبرشان کند.
نامانگلیسیگونهتوضیح
handlehandleتهی*متغیر شرط سیستم‌عامل.
sync-CondVar.salam
واردسازی همگام سازی

ناپایا آماده := نادرست
ناپایا قفل := همگام سازی.قفل {}
ناپایا شرط := همگام سازی.متغیر شرط {}

روال سازنده():
    همگام سازی.خواب میلی ثانیه(۲۰)
    همگام سازی.قفل کردن(قفل)
    آماده = درست
    همگام سازی.اعلام سراسری(شرط)
    همگام سازی.باز کردن قفل(قفل)
پایان

روال ریشه:
    قفل = همگام سازی.قفل جدید()
    شرط = همگام سازی.متغیر شرط جدید()
    آغاز := همگام سازی.اکنون میلی ثانیه()
    همگام سازی.قفل کردن(قفل)
    سرچاپ همگام سازی.انتظار شرط با مهلت(شرط، قفل، ۱۰)
    ن := spawn(سازنده)
    تا وارونه آماده:
        همگام سازی.انتظار شرط(شرط، قفل)
    پایان
    همگام سازی.باز کردن قفل(قفل)
    join(ن)
    سرچاپ آماده، همگام سازی.اکنون میلی ثانیه() - آغاز >= ۲۰
    همگام سازی.اعلام(شرط)
    همگام سازی.نابودسازی متغیر شرط(شرط)
    همگام سازی.نابودسازی(قفل)
پایان
خروجیtrue true true

گروه انتظار WaitGroup

ساختار گروه انتظار
گروه انتظار: شمارنده‌ای از کارهای ناتمام.
نامانگلیسیگونهتوضیح
countercounterصحیح۶۴*شمار کارهای ناتمام.
mumuتهی*قفل درونی.
cvcvتهی*متغیر شرط درونی.

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

قفل خواندن نوشتن RWMutex

ساختار قفل خواندن نوشتن
قفل خواندن و نوشتن: چند خواننده با هم، یا یک نویسنده به‌تنهایی.
نامانگلیسیگونهتوضیح
statestateصحیح۶۴*وضعیت درونی: خواننده‌ها، نویسنده و نویسنده‌های منتظر.
mumuتهی*قفل درونی.
cvcvتهی*متغیر شرط درونی.
sync-RWMutex.salam
واردسازی همگام سازی

روال ریشه:
    ق := همگام سازی.قفل خواندن نوشتن جدید()
    همگام سازی.قفل خواندن(ق)
    همگام سازی.قفل خواندن(ق)
    سرچاپ "دو خواننده با هم"
    همگام سازی.باز کردن قفل خواندن(ق)
    همگام سازی.باز کردن قفل خواندن(ق)
    همگام سازی.قفل نوشتن(ق)
    سرچاپ "یک نویسنده به‌تنهایی"
    همگام سازی.باز کردن قفل نوشتن(ق)
    همگام سازی.نابودسازی قفل خواندن نوشتن(ق)

    ن := همگام سازی.نشانگر جدید(۲)
    همگام سازی.گرفتن(ن)
    سرچاپ همگام سازی.تلاش برای گرفتن(ن)، همگام سازی.تلاش برای گرفتن(ن)
    همگام سازی.رها کردن(ن)
    سرچاپ همگام سازی.تلاش برای گرفتن(ن)
    همگام سازی.نابودسازی نشانگر(ن)

    ی := همگام سازی.یک بار جدید()
    تکرار ۳:
        همگام سازی.انجام(ی، (): سرچاپ "فقط یک بار" پایان)
    پایان
    همگام سازی.نابودسازی یک بار(ی)
پایان
خروجیدو خواننده با هم یک نویسنده به‌تنهایی true false true فقط یک بار

نشانگر Semaphore

ساختار نشانگر
نشانگر: تعداد محدودی مجوز که نخ‌ها می‌گیرند و پس می‌دهند.
نامانگلیسیگونهتوضیح
permitspermitsصحیح۶۴*شمار مجوزهای آزاد.
mumuتهی*قفل درونی.
cvcvتهی*متغیر شرط درونی.

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

یک بار Once

ساختار یک بار
«یک بار»: روالی را فقط بار اول اجرا می‌کند.
نامانگلیسیگونهتوضیح
donedoneصحیح۶۴*آیا روال اجرا شده.
mumuتهی*قفل درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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