go lang學習筆記——channel機理及調度理解

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。《Go語言編程》一書介紹了libtask庫,可以認為這個庫等同於go的底層goroutine實現。libtask庫的channel的資料結構如下:
struct Alt{    Channel *c;    void *v;    unsigned int op;    Task *task;    Alt *xalt;}; struct Altarray{    Alt **a;    unsigned int n;    unsigned int m;}; struct Channel{    unsigned int bufsize;    unsigned int elemsize;    unsigned char *buf;    unsigned int nbuf;    unsigned int off;    Altarray asend;    Altarray arecv;    char *name;};

我們可以看到channel的基本組成如下:  記憶體緩衝,用於存放元素;  發送隊列;  接受隊列。
書中羅列完channel的結構後沒有深入講解如何在channel這個結構上進行通訊的過程。其實結合書中前面介紹的內容task(協程)的通訊過程已經不言而明了。但是從學習者的角度,當然是把這個問題講解的越明白越好。接下來我試著介紹一下task(協程)是如何在這個channel的基礎上通訊的。對於一個往channel裡寫資料的情況:


對於一個從channel裡讀資料的情況:


注意:以上兩個流程都是基於書中對協程的工作原理和channel資料結構的介紹後我個人腦補的,並沒有去翻看libtask的代碼。很可能存在疏漏,只應當把這兩個流程作為理解協程工作方式的參照。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.