当前位置: 首页 > news >正文

冠县建设局网站嵌入式软件开发是什么意思

冠县建设局网站,嵌入式软件开发是什么意思,温州优化网站方法,门户网站建设兴田德润先说结论 1. golang提供了syscall包来实现文件/目录的加锁#xff0c;解锁 2. syscall包属于文件锁#xff0c;是比较底层的技术#xff0c;并不能在所有操作系统上完全实现#xff0c;linux上实现了#xff0c;windows下面就没有 3. 加锁时调用syscall.Flock(fd#…先说结论 1. golang提供了syscall包来实现文件/目录的加锁解锁 2. syscall包属于文件锁是比较底层的技术并不能在所有操作系统上完全实现linux上实现了windows下面就没有 3. 加锁时调用syscall.Flock(fdsyscall.LOCK_EX)解锁时调用syscall.Flock(fd, syscall.LOCK_UN) 4. 加锁成功后对加锁的文件fd进行Close()操作同样会释放锁切记 代码实现 锁的定义如下内部两个变量文件/目录的全路径名文件对象 // 文件锁/目录锁 type DirLock struct {     dir     string        // 文件/目录的全路径名     f       *os.File    // 文件对象 } 加锁的实现 核心代码是 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 } 解锁的实现 核心代码是 syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) LOCK_UN 解锁标记。如果自己已经加锁成功可以用此标记去解锁 // 解锁 func (l *DirLock) Unlock() error {     defer l.f.Close() // 关闭文件     return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) // LOCK_UN表解锁 } 实验 我们建立5个协程每秒去尝试加锁一次失败则1秒后重试成功则持续2秒后解锁 核心代码如下 // 5个协程都尝试对目录加锁加锁失败的就重试加锁成功的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() 实验结果如下图 完整代码 package main import (fmtossyncsyscalltime )// 目录锁 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() // 其实不执行Close()也会释放目录锁return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) }func main() {dir, _ : os.Getwd()wg : sync.WaitGroup{}// 5个协程都尝试对目录加锁加锁失败的就重试加锁成功的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.w-s-a.com/news/199818/

相关文章:

  • 一个新的网站怎么做宣传技术先进的网站建
  • 福建网站建设有限公司需求网站
  • 生物科技企业网站做的比较好的企业培训网站模板
  • 南京 高端网站建设网站备案密码怎么找回
  • 蛋糕店网站模板建设电子商务系统网站
  • 海口网站建设优化公司网站开发要加班吗
  • 建设一个网站需要注意哪些要求群晖的网站开发
  • 精通网站开发阅读网页视频下载慢怎么办
  • 网站标题的选择巴音郭楞库尔勒网站建设
  • 成都市网站建设服务商怎么进网站后台管理系统
  • 企业网站站内优化30岁做网站编辑
  • 与安网站建设网站建设征求意见稿
  • 学校网站推广做网站手把手
  • 网站开发遇到的难题wordpress文章调用
  • 网站建设做的好在线logo免费设计生成器标智客
  • 郑州做网站齿轮网站排名怎么做 site
  • 船员专用网站开发建议wordpress 图片占用id
  • 桌面软件开发跟网站开发那个上海网站备案在哪里查询
  • 罗湖网站建设陕西省建设网官网住房和城乡厅官网
  • 做一个网站的详细教学wordpress 忘记用户名密码
  • 建设银行的网站是多少wordpress添加新页面跳转
  • 网站设计费用抓取网站访客qq号码
  • 驾校视频网站模板郑州网站建设价格
  • 上海 有哪些做网站的公司成都企业网站备案流程
  • 移动端快速建站的方法青海公司网站建设
  • 网站重新搭建程序要多少钱移动互联网应用的使用情况
  • 学建站论坛给别人做网站怎么赚钱吗
  • 响应式网站代码校友会网站建设的目的
  • 北京公司网站网站建设html模板
  • 专门做医疗器械的网站免费网页制作系统团队