本文共 3354 字,大约阅读时间需要 11 分钟。
在学习互斥量之前,我们要清楚什么情况下需要使用互斥量,第一个例子中有一段共享数据g_v,在main()函数中创建了10个线程,这10个线程的入口函数均为myprint(),在函数中打印出共享数据,代码如下:
#include
运行结果如下:

可以看到程序正常运行,说明只读数据的共享是安全稳定的,不需要特别的处理手段
我们再来看看有读有写的数据的情况,程序背景如下:
–>模拟一个网络游戏服务器,
服务器有两个线程,一个线程用于收集玩家命令(范例中简化用一个数组代表),并把命令写到一个队列中。
另一个线程用于从队列中取出玩家发出的命令,解析,执行玩家需要的动作。
代码如下:
#include
执行结果如下:
处理程序奔溃,因为在线程二读取队列内容时线程一也在插入数据,导致了不确定性。最简单的处理是读写不能同时进行,不能同时写,不能同时读。为了保护共享数据我们引入了“互斥量mutex”,
先lock(),操作共享数据,再unlock(),lock()和unlock()必须成对使用。
在使用mutex前,先声明mutex my_mutex;具体使用如下:
#include
msgRecvQ;//容器,用于接收玩家发过来的命令 mutex my_mutex;};int main(){ A myTask; thread myOutMsgThread(&A::outMsgRecvQ, &myTask);//第二个参数是引用类型,这样才能保证线程里用的是同一个对象 thread myInMsgThread(&A::inMsgRecvQ, &myTask); myInMsgThread.join(); myOutMsgThread.join(); return 0;}
std::lock_guard可以直接取代lock()和unlock(),也就是说你使用lock_guard()后就不能使用lock()和unlock()了。
lock_guard构造函数里执行了mutex::lock(),析构函数里执行了mutex::unlock().