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

网站开发保密合同范本厦门网页设计招聘

网站开发保密合同范本,厦门网页设计招聘,网站的组成部分,手机端网站建站手册先说结论 1. golang提供了syscall包来实现文件/目录的加锁,解锁 2. syscall包属于文件锁,是比较底层的技术,并不能在所有操作系统上完全实现,linux上实现了,windows下面就没有 3. 加锁时调用syscall.Flock(fd&#…

先说结论

1. golang提供了syscall包来实现文件/目录的加锁,解锁

2. syscall包属于文件锁,是比较底层的技术,并不能在所有操作系统上完全实现,linux上实现了,windows下面就没有

3. 加锁时调用syscall.Flock(fd,syscall.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 ("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() // 其实不执行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.yayakq.cn/news/770851/

相关文章:

  • 学校门户网站建设报告做高仿表网站
  • 充值话费网站建设网站域名备案多长时间
  • 插画设计网站推荐网站开发大公司需要资格证吗
  • 东莞做网站价格软件开发模型的优缺点及适用范围
  • 网站如何解除绑定域名网站显示iis7
  • 东莞建设网站公司网站为何不显示百度商桥对话框
  • 设计网站制米拓网站建设步骤
  • 做编程的 网站专门做推广的网站
  • .net网站开发技术简介潍坊网站建设中公
  • 网站内页全是404网站怎么更新文章
  • 百度网站wordpress底部排
  • 网站 关键词库网络营销4c
  • 珠海网站制作哪家好电子商务的工作岗位有哪些?
  • 个人备案的网站可以做商城wordpress分享按钮
  • 做百科发那些网站新闻好做网站界面设计大小
  • 公众号怎么建网站网站手机自动跳转
  • 鼓楼机关建设网站wordpress 登录保护
  • 电商网站设计案例服装厂家东莞网站建设
  • 怎么做网盘搜索引擎网站欢迎页面模板
  • 如何快速学成网站开发wordpress相册移植typecho
  • 免网站域名注册金乡县住房与城乡建设局网站
  • 网站建设推荐信息佛山市住房和城乡建设部网站
  • 装修平台网站排名前十名有哪些厦门网站推广优化哪家好
  • 南京网站设计制作公司排名榜微信怎么申请小程序
  • 七个php源码下载的网站免费多用户商城系统源码
  • 波哥昆明网站建设昆明房地产网站建设
  • 网站建设职责建设企业网站的意义
  • 网站架构图图郑州同济医院
  • 海尔建设网站的内容emlog转移到wordpress
  • 中国效能建设网站做网站挣钱不