4 12 併發技術 sync包同步排程綜合案例

2021-09-09 05:17:02 字數 1877 閱讀 3229

同步排程概述

本例需求摘要

本例技術棧

實現思路摘要

完整實現

import (

"errors"

"fmt"

"io"

"os"

"sync"

"sync/atomic"

)/*給原始位元組切片起乙個類別名*/

type data byte

type datafile struct

/*工廠方法

引數:path string 檔案路徑

datalen uint32 指定資料塊大小

----------

返回值:

datafile 資料檔案物件

error 錯誤

*/func newdatafile(path string, datalen uint32) (*datafile, error)

/*資料塊大小不能為0*/

if datalen == 0

//建立指定的mydatafile物件,並指定io檔案和資料塊大小

df := &datafile

//初始化df物件的條件變數

df.rcond = sync.newcond(df.fmutex.rlocker())

return df, nil

}/*返回下一次要讀取的資料塊的序列號*/

func (df *datafile) rsn() int64

/*返回下一次要寫入的資料塊的序列號*/

func (df *datafile) wsn() int64

/*返回塊檔案的大小*/

func (df *datafile) datalen() uint32

/*可以讀,返回值:

rsn read-serial-number 當前讀取到的【資料塊序列號】

data 原始位元組資料

err 錯誤

*/func (df *datafile) read() (rsn int64, data data, err error) ()

for

return

} //正常地讀到資料,並返回

data = buffer

//通過原子操作,讓最後一次讀取的位元組偏移量+=df.datalen

atomic.addint64(&df.roffset, int64(df.datalen))

return }}

func (df *datafile) write(data data) (wsn int64, err error) else

/*加寫鎖準備進行寫入*/

df.fmutex.lock()

fmt.println("write get lock")

defer func() ()

/*進行資料寫入*/

//寫入資料,並向讀取協程傳送通知訊號

_, err = df.f.writeat(buffer, offset)

if err == nil

return

}

測試效果

func main() ()

/*讀取3個資料塊*/

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...