doujinge9648 2017-11-18 18:10
浏览 34

在golang中,如何保护自己的锁安全装置不受调用者破坏?

I try use "sync.mutex" protect my func,but i found that the lock still uses the caller to destroy it.

var mutex sync.mutex

This is error:

//caller use
func a() {
    for i := 0; i < 10; i++ {
        go b(i)
    }
}

//My func
func b(i int) {
    mutex.Lock()
    fmt.Println(i)
    mutex.Unlock()
}

this is success,but destroyed my encapsulation method:

//caller use
func a() {
    for i := 0; i < 10; i++ {
        mutex.Lock()
        go b(i)
    }
}

//my func
func b(i int) {
    fmt.Println(i)
    mutex.Unlock()
}

Thanks

  • 写回答

2条回答 默认 最新

  • dongshengli6384 2017-11-18 18:39
    关注

    The Go Programming Language Specification

    Exported identifiers

    An identifier may be exported to permit access to it from another package. An identifier is exported if both:

    • the first character of the identifier's name is a Unicode upper case letter (Unicode class "Lu"); and
    • the identifier is declared in the package block or it is a field name or method name.

    All other identifiers are not exported.

    Put the function in its own package and don't export the mutex. For example.

    package b
    
    import (
        "fmt"
        "sync"
    )
    
    var mutex sync.Mutex
    
    func B(i int) {
        mutex.Lock()
        fmt.Println(i)
        mutex.Unlock()
    }
    

    To use,

    package a
    
    import "b"
    
    func a() {
        for i := 0; i < 10; i++ {
            go b.B(i)
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端