同步排程概述
本例需求摘要
本例技術棧
實現思路摘要
完整實現
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 之外的型...