中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

東莞做網(wǎng)站哪家最好網(wǎng)站模板建站公司

東莞做網(wǎng)站哪家最好,網(wǎng)站模板建站公司,網(wǎng)站預(yù)算表怎么做,ppt設(shè)計器怎么打開先說結(jié)論 1. golang提供了syscall包來實現(xiàn)文件/目錄的加鎖,解鎖 2. syscall包屬于文件鎖,是比較底層的技術(shù),并不能在所有操作系統(tǒng)上完全實現(xiàn),linux上實現(xiàn)了,windows下面就沒有 3. 加鎖時調(diào)用syscall.Flock(fd&#…

先說結(jié)論

1. golang提供了syscall包來實現(xiàn)文件/目錄的加鎖,解鎖

2. syscall包屬于文件鎖,是比較底層的技術(shù),并不能在所有操作系統(tǒng)上完全實現(xiàn),linux上實現(xiàn)了,windows下面就沒有

3. 加鎖時調(diào)用syscall.Flock(fd,syscall.LOCK_EX),解鎖時調(diào)用syscall.Flock(fd, syscall.LOCK_UN)

4. 加鎖成功后,對加鎖的文件fd進行Close()操作同樣會釋放鎖,切記

代碼實現(xiàn)

鎖的定義如下內(nèi)部兩個變量:文件/目錄的全路徑名,文件對象

// 文件鎖/目錄鎖
type DirLock struct {
?? ?dir ?? ?string?? ??? ?// 文件/目錄的全路徑名
?? ?f ? ?? ?*os.File?? ?// 文件對象
}

加鎖的實現(xiàn)

核心代碼是 syscall.Flock(int(f.Fd()), LOCK_EX|syscall.LOCK_NB),注意其中的標記

LOCK_EX :加鎖標記。只有一個進程能加鎖成功,其他進程再嘗試加鎖時會阻塞,等同于我們常用的寫鎖

LOCK_NB :不阻塞標記。如果其他進程已加鎖成功,自己去嘗試加鎖時就不再阻塞,而是直接返回錯誤

// 加鎖
func (l *DirLock) Lock() error {
?? ?f, err := os.Open(l.dir)
?? ?if err != nil {
?? ??? ?return err
?? ?}
?? ?l.f = f

?? ?err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
?? ?if err != nil {
?? ??? ?return err
?? ?}
?? ?return nil
}

解鎖的實現(xiàn)

核心代碼是?syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)

LOCK_UN :解鎖標記。如果自己已經(jīng)加鎖成功,可以用此標記去解鎖

// 解鎖
func (l *DirLock) Unlock() error {
?? ?defer l.f.Close() // 關(guān)閉文件

?? ?return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) // LOCK_UN表解鎖
}

實驗

我們建立5個協(xié)程,每秒去嘗試加鎖一次,失敗則1秒后重試,成功則持續(xù)2秒后解鎖

核心代碼如下

?? ?// 5個協(xié)程,都嘗試對目錄加鎖,加鎖失敗的就重試,加鎖成功的2秒后釋放
?? ?for i := 0; i < 5; i++ {
?? ??? ?wg.Add(1)

?? ??? ?go func(num int) {
?? ??? ??? ?dirLock := New(dir)
?? ??? ??? ?ticker := time.NewTicker(time.Second) // 定時器每秒嘗試1次
?? ??? ??? ?for {
?? ??? ??? ??? ?select {
?? ??? ??? ??? ?case <-ticker.C:
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?err := dirLock.Lock() // 加鎖嘗試
?? ??? ??? ??? ??? ??? ?if err != nil {
?? ??? ??? ??? ??? ??? ??? ?fmt.Printf("lock dir failed, goroutine num=%d, err=%s \n", num, err.Error())
?? ??? ??? ??? ??? ??? ??? ?continue
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?fmt.Println("lock dir succeed, goroutine num=", num)
?? ??? ??? ??? ??? ??? ?goto end
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}

?? ??? ??? ?end:
?? ??? ??? ?time.Sleep(time.Second*2)
?? ??? ??? ?dirLock.Unlock() // 解鎖
?? ??? ??? ?wg.Done()
?? ??? ?}(i)
?? ?}
?? ?wg.Wait()

實驗結(jié)果如下圖

完整代碼

package main
import ("fmt""os""sync""syscall""time"
)// 目錄鎖
type DirLock struct {dir 	string		// 目錄的全路徑名f   	*os.File	// 文件對象
}func New(dir string) *DirLock {return &DirLock{dir: dir,}
}// 加鎖
func (l *DirLock) Lock() error {f, err := os.Open(l.dir)if err != nil {return err}l.f = ferr = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)if err != nil {return err}return nil
}// 釋放鎖
func (l *DirLock) Unlock() error {defer l.f.Close() // 其實不執(zhí)行Close()也會釋放目錄鎖return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)
}func main() {dir, _ := os.Getwd()wg := sync.WaitGroup{}// 5個協(xié)程,都嘗試對目錄加鎖,加鎖失敗的就重試,加鎖成功的2秒后釋放for i := 0; i < 5; i++ {wg.Add(1)go func(num int) {dirLock := New(dir)ticker := time.NewTicker(time.Second) // 定時器每秒嘗試1次for {select {case <-ticker.C:{err := dirLock.Lock() // 加鎖嘗試if err != nil {fmt.Printf("lock dir failed, goroutine num=%d, err=%s \n", num, err.Error())continue}fmt.Println("lock dir succeed, goroutine num=", num)goto end}}}end:time.Sleep(time.Second*2)dirLock.Unlock() // 解鎖wg.Done()}(i)}wg.Wait()
}
http://www.risenshineclean.com/news/51033.html

相關(guān)文章:

  • 谷歌網(wǎng)站統(tǒng)計壹起航網(wǎng)絡(luò)推廣的目標
  • 公司網(wǎng)站建設(shè)合同書網(wǎng)絡(luò)推廣網(wǎng)站公司
  • 國家高新技術(shù)企業(yè)公示名單成都seo網(wǎng)站qq
  • 合肥 網(wǎng)站建設(shè)自媒體培訓(xùn)
  • 全市政府網(wǎng)站建設(shè)管理的講話seo推廣效果怎么樣
  • 做業(yè)務(wù)員找數(shù)據(jù)的網(wǎng)站網(wǎng)絡(luò)推廣app是違法的嗎
  • 建設(shè)企業(yè)官方網(wǎng)站的流程泉州搜索推廣
  • 吉首做網(wǎng)站中小企業(yè)網(wǎng)絡(luò)推廣
  • 做網(wǎng)站可以賺錢嗎知乎百度推廣電話客服
  • 深圳外貿(mào)建設(shè)網(wǎng)站網(wǎng)站建設(shè)步驟
  • 網(wǎng)站建設(shè)介紹nba最新交易一覽表
  • 網(wǎng)站建設(shè)如何復(fù)制鏈接網(wǎng)絡(luò)營銷的重要性與意義
  • 無錫網(wǎng)站建設(shè)專家無錫網(wǎng)站制作福州網(wǎng)站排名推廣
  • 把excel做數(shù)據(jù)庫分享成網(wǎng)站2021百度模擬點擊工具
  • 網(wǎng)站維護合同模板百度推廣收費標準
  • 一般建一個外貿(mào)網(wǎng)站多少錢百度關(guān)鍵詞優(yōu)化快速排名軟件
  • 網(wǎng)站招標書怎么做香港seo公司
  • 有哪個網(wǎng)站可以做口腔執(zhí)業(yè)助理醫(yī)師題庫互聯(lián)網(wǎng)營銷師培訓(xùn)課程
  • 現(xiàn)在網(wǎng)站建設(shè)還用測瀏覽器嗎企業(yè)培訓(xùn)課程安排表
  • 有多少網(wǎng)站是做廢舊信息的edm營銷
  • 深圳做企業(yè)網(wǎng)站的公北京搜索引擎優(yōu)化
  • 網(wǎng)站為什么續(xù)費域名??繛g覽器
  • app產(chǎn)品網(wǎng)站建設(shè)沈陽線上教學(xué)
  • 制作視頻網(wǎng)站教程網(wǎng)站測速工具
  • 廣州建網(wǎng)站培訓(xùn)刷粉網(wǎng)站推廣馬上刷
  • 做國外購物網(wǎng)站網(wǎng)上怎么找人去推廣廣告
  • 站長素材網(wǎng)站種子搜索神器在線引擎
  • 邯鄲網(wǎng)站優(yōu)化平臺fifa最新排名出爐
  • 手機網(wǎng)站制作合同如何聯(lián)系百度推廣
  • 什么是網(wǎng)站維護寧波優(yōu)化系統(tǒng)