結構體 通道 併發實現生產者消費者

2021-10-02 01:12:46 字數 1071 閱讀 2671

要求:利用生產者消費者實現對乙個隨機數所有位求和(體現結構體與通道)

實現:item結構體儲存id與乙個隨機數,itemchan作為通道儲存item結構體

result結構體儲存item指標與對item的num隨機數所有位求和的結果,resultchan作為通道儲存result結構體

啟動兩個生產者,利用函式實現自定義啟動n個消費者,關鍵是最後的printresult函式,與通道交流時同時阻塞了main,防止main的結束迫使所有goroutine結束。

package main

import (

"fmt"

"math/rand"

)var itemchan chan *item //存放待求和結構體的通道

var resultchan chan *result //存放求和結果結構體的通道

//待求和結構體

type item struct

//求和結果結構體

type result struct

//生產者,初始化待求和結構體,存入*item型別通道

func producer(ch chan *item)

//2.把隨機數所在結構體傳送到通道

ch <- tmp }}

//計算乙個數字所有位之和

func calc(num int64) int64

return sum

}//消費者,從*item型別通道取值處理,利用結果來初始化求和結果結構體,存入*result型別通道

func consumer(itemch chan *item, resultchan chan *result)

resultchan <- rstobj }}

//go執行多個消費者

func startmulticonsumer(n int, itemch chan *item, rstchan chan *result)

}//列印求和結果通道裡的資料

func printresult(rstchan chan *result)

}func main()

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...