Go语言中mutex如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
临界区(Critical Section): 当程序并发地运行时,多个Go协程不应该同时访问那些修改共享资源的代码,这些修改共享资源的代码称为临界区。
竞态条件:它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺序或者出现时机。举例来说,如果计算机中的两个进程同时试图修改一个共享内存的内容,在没有并发控制的情况下,最后的结果依赖于两个进程的执行顺序与时机。而且如果发生了并发访问冲突,则最后的结果是不正确的。
锁:是在执行并发时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。一般的锁是建议锁(advisory lock),每个线程在访问对应资源前都需获取锁的信息,再根据信息决定是否可以访问。若访问对应信息,锁的状态会改变为锁定,因此其他线程此时不会访问该资源,当资源结束后,会恢复锁的状态,允许其他线程的访问。
在了解了上面的基本概念之后,我们来看下Go语言中的mutex。
mutex 用于提供一种加锁机制,可确保在某时刻只有一个协程在临界区运行,以防止出现竞态条件。
mutexs是Go的sync包中的一个数据结构,定义了两个方法:Lock 和 Unlock。所有在 Lock 和 Unlock 之间的代码,都只能由一个 Go 协程执行,于是就可以避免竞态条件。
1) 不用mutex的例子:
output:
结果分析:我们执行了5次程序,发现输出的结果并不一致。原因就是 这100个协程,产生了竞态关系,导致计算的结果,并不是100, 而是变成了不确定的值。
2)使用mutex的例子:(我们通过mutex的锁机制来解决这个问题)
Output:
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。