هر چیزی که با دنیای خارج در تماس باشه io حساب می شه. ( به جزء دسترسی مموری). چراش هم اینه که cpu برای این کار ها نیاز داره که یه سری instruction های خاص رو صدا بزنه و دیتا رو از یه دیوایس بخونه و یه جایی روی مموری و یا کش لود کنه و باهاش کار کنه.
channel و اینا خیلی high level هستند و جای یحث خودشون رو دارن. اما اینجوری به داستان نگاه نکن که ترد ۱ و ترد ۲ دو تا چیز متفاوت هستند که لازم باشه بینشون چیزی پاس بدی. دیدت به ترد ها مثل پروسس هاست که خوب درست نیست. تو کار با ترد ها از اونجایی که یه سری سگمنت ها بین ترد ها مشترک هست باید با دسترسی به مموری بینشون دیتا به اشتراک بذاری که خود این موضوع خودش بحث مربوط به خودش رو پیش می آره و بخاطر پیچیدگیش abstraction های زیادی ساخته شده ( مثل همین channel ها ) که ساده تر کنه کار کردن با ترد ها رو.
در مورد اروری که دادی باید کد رو ببینم تا بتونم کمک کنم اما تقریبا همیشه بهتره از یه abstraction ها و ابزار های پیش ساخته استفاده کنی تا بخوای در پایین ترین سطح مدیریت ترد ها رو انجام بدی. و بهتر زبانی رو انتخاب کنی که طراحی بهتری داره برای اینکار.
مقاله و اینا که زیاده خیلی اما پیشنهاد می کنم از کف شروع کنی و مفاهیم پایه رو خوب یاد بگیری بعد بری سراغ مفاهیم high level تر. برای همین خیلی پیشنهاد می کنم در مورد ترد ها و تفاوت ها شون با پروسس ها و پیاده سازی هاشون بخونی. در مورد لاک ها و …
خود سازنده اصلیش در مورد shared data ها و ارتباط بین ترد ها یکی دوتا مقاله داره که در مورد lock و … یکم حرف زده ولی خودش میگه استفاده از channel ها کار هوشمندانه تریه.
همون جور که عرض کردم استفاده از abstraction های high level تر مثل CSP و … ۱۰۰٪ بهتره. ولی اگر می خوای در این زمینه بیشتر بدونی باید اول مفاهیم پایه ای رو بررسی کنی. ولی اگر می خوای فقط در حد استفاده بدونه که خوب همون CSP و اینا کفایت می کنه. CSP توی خیلی از زبان ها پیاده سازی شده که می تونی به اونا هم نگاه بندازی