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

کانال chan

کانال برای فرستادن مقدار از یک نخ به نخ دیگر، با بافر، مهلت و بستن.

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

کانال صفی است که چند نخ از یک سر آن مقدار می‌فرستند و از سر دیگر دریافت می‌کنند؛ قفل‌ها و انتظارها را خودش مدیریت می‌کند. گونه‌ی مقدارها را هنگام ساختن می‌گویید، مثل کانال.کانال<صحیح۶۴>، و پیش از استفاده مقداردهی را با ظرفیت صدا می‌زنید.

اگر بافر پر باشد، فرستادن صبر می‌کند؛ اگر خالی باشد، دریافت. کانال با ظرفیت صفر «بی‌بافر» است: فرستنده تا وقتی گیرنده مقدار را برندارد صبر می‌کند. پس از بستن، فرستادن نادرست برمی‌گرداند ولی گیرنده‌ها هنوز مقدارهای مانده را می‌گیرند؛ وقتی کانال خالی شد، باز نادرست می‌شود و حلقه‌ی گیرنده می‌تواند تمام شود.

گونه‌ها

کانال Chan

ساختار کانال<T>
کانالی از مقدارهای گونه‌ی T.
نامانگلیسیگونهتوضیح
bufbufT*بافر مقدارها.
ctlctlصحیح۶۴*وضعیت درونی: سر و ته صف، تعداد و بسته بودن.
capcapصحیح۶۴ = 0ظرفیت.
zidxzidxصحیح۶۴ = 0خانه‌ای از بافر که مقدار صفر گونه را نگه می‌دارد، برای وقتی چیزی دریافت نشد.
mumusync.Mutexقفل درونی.
not_emptynot_emptysync.CondVarبیدار کردن گیرنده‌ها.
not_fullnot_fullsync.CondVarبیدار کردن فرستنده‌ها.
takentakensync.CondVarخبر برداشتن مقدار در کانال بی‌بافر.
chan-Chan.salam
واردسازی کانال
واردسازی همگام سازی

ناپایا کارها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>
ناپایا نتیجه‌ها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>
ناپایا گروه := همگام سازی.گروه انتظار {}

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

روال ریشه:
    کارها.مقداردهی(۴)
    نتیجه‌ها.مقداردهی(۱۶)
    گروه = همگام سازی.گروه انتظار جدید()
    همگام سازی.افزودن(گروه، ۲)
    الف := spawn(کارگر)
    ب := spawn(کارگر)
    تکرار ۱ تا ۱۱ در ع:
        کارها.فرستادن(ع)
    پایان
    کارها.بستن()
    همگام سازی.انتظار(گروه)
    join(الف)
    join(ب)
    نتیجه‌ها.بستن()
    ناپایا جمع := ۰ برگردان صحیح۶۴
    ناپایا باز := درست
    تا درست:
        م := نتیجه‌ها.دریافت(باز)
        اگر وارونه باز:
            بشکن
        پایان
        جمع += م
    پایان
    سرچاپ "جمع مربع‌ها:"، جمع
    سرچاپ کارها.بسته است()، کارها.طول()، کارها.ظرفیت()، کارها.فرستادن(۱)
    همگام سازی.نابودسازی گروه انتظار(گروه)
    کارها.آزادسازی()
    نتیجه‌ها.آزادسازی()
پایان
خروجیجمع مربع‌ها: 506 true 0 4 false

مقداردهی init

روال مقداردهی(capacity: صحیح۶۴)
کانال را با ظرفیت داده‌شده آماده می‌کند؛ صفر یعنی بی‌بافر.

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

فرستادن send

روال فرستادن(v: T): منطقی
مقدار را می‌فرستد و اگر جا نباشد صبر می‌کند. اگر کانال بسته باشد، نادرست برمی‌گرداند.

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

فرستادن با مهلت send_timeout

روال فرستادن با مهلت(v: T، ms: صحیح۶۴): منطقی
مثل فرستادن، ولی حداکثر ms میلی‌ثانیه صبر می‌کند.
chan-Timeout.salam
واردسازی کانال

روال ریشه:
    ناپایا ک := کانال.کانال {} برگردان کانال.کانال<رشته>
    ک.مقداردهی(۱)
    سرچاپ ک.تلاش برای فرستادن("سلام")، ک.تلاش برای فرستادن("دوباره")
    سرچاپ ک.فرستادن با مهلت("دیر"، ۲۰)
    ناپایا باز := درست
    سرچاپ ک.تلاش برای دریافت(باز)، باز
    _ := ک.دریافت با مهلت(باز، ۲۰)
    سرچاپ "پس از ۲۰ میلی‌ثانیه:"، باز
    سرچاپ ک.فرستادن با موعد("الف"، ۰، نادرست)
    سرچاپ ک.دریافت با موعد(باز، ۲۰، درست)، باز
    ک.آزادسازی()
پایان
خروجیtrue false false سلام true پس از ۲۰ میلی‌ثانیه: false true الف true

فرستادن با موعد send_deadline

روال فرستادن با موعد(v: T، ms: صحیح۶۴، timed: منطقی): منطقی
پایه‌ی دو روال بالا: اگر timed درست باشد، تا ms میلی‌ثانیه صبر می‌کند و وگرنه بی‌پایان.

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

دریافت recv

روال دریافت(ok &: منطقی): T
یک مقدار دریافت می‌کند و اگر چیزی نباشد صبر می‌کند. اگر کانال بسته و خالی باشد، ok نادرست می‌شود؛ در این حالت مقدار برگشتی معنایی ندارد و نباید به کارش ببرید.

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

دریافت با مهلت recv_timeout

روال دریافت با مهلت(ok &: منطقی، ms: صحیح۶۴): T
مثل دریافت، ولی حداکثر ms میلی‌ثانیه صبر می‌کند. اگر چیزی نرسید، ok نادرست می‌شود.

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

دریافت با موعد recv_deadline

روال دریافت با موعد(ok &: منطقی، ms: صحیح۶۴، timed: منطقی): T
پایه‌ی دو روال بالا، با همان معنای timed.

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

تلاش برای فرستادن try_send

روال تلاش برای فرستادن(v: T): منطقی
اگر فوراً جا باشد می‌فرستد؛ صبر نمی‌کند. در کانال بی‌بافر همیشه نادرست است.

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

تلاش برای دریافت try_recv

روال تلاش برای دریافت(ok &: منطقی): T
اگر فوراً مقداری باشد دریافت می‌کند و ok را درست می‌کند؛ صبر نمی‌کند.

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

بستن close

روال بستن()
کانال را می‌بندد و همه‌ی نخ‌های منتظر را بیدار می‌کند.

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

بسته است is_closed

روال بسته است(): منطقی
آیا کانال بسته شده.

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

طول len

روال طول(): صحیح۶۴
تعداد مقدارهای منتظر در بافر.

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

ظرفیت capacity

روال ظرفیت(): صحیح۶۴
ظرفیت کانال.

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

آزادسازی free

روال آزادسازی()
حافظه‌ی کانال را آزاد می‌کند.

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