加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Semaphore 数据结构分解详解

发布时间:2021-05-26 08:24:07 所属栏目:语言 来源:互联网
导读:副标题#e# //Go语言中暴露的semaphore实现 //具体的用法是提供sleep和wakeup原语 //以使其能够在其它同步原语中的竞争情况下使用 //因此这里的semaphore和Linux中的futex目标是一致的 //只不过语义上更简单一些 // //也就是说,不要认为这些是信号量 //把这

                                                                              └───────────────────────┘ 

对外封装

在 sema.go 里实现的内容,用 go:linkname 导出给 sync、poll 库来使用,也是在链接期做了些手脚:

//go:linkname sync_runtime_Semacquire sync.runtime_Semacquire 

func sync_runtime_Semacquire(addr *uint32) { 

    semacquire1(addr, false, semaBlockProfile) 

 

//go:linkname poll_runtime_Semacquire internal/poll.runtime_Semacquire 

func poll_runtime_Semacquire(addr *uint32) { 

    semacquire1(addr, false, semaBlockProfile) 

 

//go:linkname sync_runtime_Semrelease sync.runtime_Semrelease 

func sync_runtime_Semrelease(addr *uint32, handoff bool) { 

    semrelease1(addr, handoff) 

 

//go:linkname sync_runtime_SemacquireMutex sync.runtime_SemacquireMutex 

func sync_runtime_SemacquireMutex(addr *uint32, lifo bool) { 

    semacquire1(addr, lifo, semaBlockProfile|semaMutexProfile) 

 

//go:linkname poll_runtime_Semrelease internal/poll.runtime_Semrelease 

func poll_runtime_Semrelease(addr *uint32) { 

    semrelease(addr) 

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读