کانال chan
کانال برای فرستادن مقدار از یک نخ به نخ دیگر، با بافر، مهلت و بستن.
واردسازی کانال
کانال صفی است که چند نخ از یک سر آن مقدار میفرستند و از سر دیگر دریافت میکنند؛ قفلها و انتظارها را خودش مدیریت میکند. گونهی مقدارها را هنگام ساختن میگویید، مثل کانال.کانال<صحیح۶۴>، و پیش از استفاده مقداردهی را با ظرفیت صدا میزنید.
اگر بافر پر باشد، فرستادن صبر میکند؛ اگر خالی باشد، دریافت. کانال با ظرفیت صفر «بیبافر» است: فرستنده تا وقتی گیرنده مقدار را برندارد صبر میکند. پس از بستن، فرستادن نادرست برمیگرداند ولی گیرندهها هنوز مقدارهای مانده را میگیرند؛ وقتی کانال خالی شد، باز نادرست میشود و حلقهی گیرنده میتواند تمام شود.
گونهها
کانال Chan
ساختار کانال<T>T.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| buf | buf | T* | بافر مقدارها. |
| ctl | ctl | صحیح۶۴* | وضعیت درونی: سر و ته صف، تعداد و بسته بودن. |
| cap | cap | صحیح۶۴ = 0 | ظرفیت. |
| zidx | zidx | صحیح۶۴ = 0 | خانهای از بافر که مقدار صفر گونه را نگه میدارد، برای وقتی چیزی دریافت نشد. |
| mu | mu | sync.Mutex | قفل درونی. |
| not_empty | not_empty | sync.CondVar | بیدار کردن گیرندهها. |
| not_full | not_full | sync.CondVar | بیدار کردن فرستندهها. |
| taken | taken | sync.CondVar | خبر برداشتن مقدار در کانال بیبافر. |
واردسازی کانال
واردسازی همگام سازی
ناپایا کارها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>
ناپایا نتیجهها := کانال.کانال {} برگردان کانال.کانال<صحیح۶۴>
ناپایا گروه := همگام سازی.گروه انتظار {}
روال کارگر():
ناپایا باز := درست
تا درست:
ع := کارها.دریافت(باز)
اگر وارونه باز:
بشکن
پایان
نتیجهها.فرستادن(ع * ع)
پایان
همگام سازی.اتمام(گروه)
پایان
روال ریشه:
کارها.مقداردهی(۴)
نتیجهها.مقداردهی(۱۶)
گروه = همگام سازی.گروه انتظار جدید()
همگام سازی.افزودن(گروه، ۲)
الف := spawn(کارگر)
ب := spawn(کارگر)
تکرار ۱ تا ۱۱ در ع:
کارها.فرستادن(ع)
پایان
کارها.بستن()
همگام سازی.انتظار(گروه)
join(الف)
join(ب)
نتیجهها.بستن()
ناپایا جمع := ۰ برگردان صحیح۶۴
ناپایا باز := درست
تا درست:
م := نتیجهها.دریافت(باز)
اگر وارونه باز:
بشکن
پایان
جمع += م
پایان
سرچاپ "جمع مربعها:"، جمع
سرچاپ کارها.بسته است()، کارها.طول()، کارها.ظرفیت()، کارها.فرستادن(۱)
همگام سازی.نابودسازی گروه انتظار(گروه)
کارها.آزادسازی()
نتیجهها.آزادسازی()
پایانمقداردهی init
روال مقداردهی(capacity: صحیح۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
فرستادن send
روال فرستادن(v: T): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
فرستادن با مهلت send_timeout
روال فرستادن با مهلت(v: T، ms: صحیح۶۴): منطقیفرستادن، ولی حداکثر ms میلیثانیه صبر میکند.واردسازی کانال
روال ریشه:
ناپایا ک := کانال.کانال {} برگردان کانال.کانال<رشته>
ک.مقداردهی(۱)
سرچاپ ک.تلاش برای فرستادن("سلام")، ک.تلاش برای فرستادن("دوباره")
سرچاپ ک.فرستادن با مهلت("دیر"، ۲۰)
ناپایا باز := درست
سرچاپ ک.تلاش برای دریافت(باز)، باز
_ := ک.دریافت با مهلت(باز، ۲۰)
سرچاپ "پس از ۲۰ میلیثانیه:"، باز
سرچاپ ک.فرستادن با موعد("الف"، ۰، نادرست)
سرچاپ ک.دریافت با موعد(باز، ۲۰، درست)، باز
ک.آزادسازی()
پایانفرستادن با موعد send_deadline
روال فرستادن با موعد(v: T، ms: صحیح۶۴، timed: منطقی): منطقیtimed درست باشد، تا ms میلیثانیه صبر میکند و وگرنه بیپایان.نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Timeout.salam
دریافت recv
روال دریافت(ok &: منطقی): Tok نادرست میشود؛ در این حالت مقدار برگشتی معنایی ندارد و نباید به کارش ببرید.نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
دریافت با مهلت recv_timeout
روال دریافت با مهلت(ok &: منطقی، ms: صحیح۶۴): Tدریافت، ولی حداکثر ms میلیثانیه صبر میکند. اگر چیزی نرسید، ok نادرست میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Timeout.salam
دریافت با موعد recv_deadline
روال دریافت با موعد(ok &: منطقی، ms: صحیح۶۴، timed: منطقی): Ttimed.نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Timeout.salam
تلاش برای فرستادن try_send
روال تلاش برای فرستادن(v: T): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: chan-Timeout.salam
تلاش برای دریافت try_recv
روال تلاش برای دریافت(ok &: منطقی): Tok را درست میکند؛ صبر نمیکند.نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Timeout.salam
بستن close
روال بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
بسته است is_closed
روال بسته است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
طول len
روال طول(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
ظرفیت capacity
روال ظرفیت(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam
آزادسازی free
روال آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: chan-Chan.salam