一 前提 以及问题
我们注意到,如果mutex.lock()两次,就会有问题
如下的代码有runtime exception
mutex mymutex; mymutex.lock(); mymutex.lock(); //共享数据访问处理代码 mymutex.unlock(); mymutex.unlock();
但是有这样的case存在
class Teacher183 { public: mutex mymutex; int num; int othernum; //1月份的时候,有个需求,我们写了个func1,共享数据num的访问,用mymutex保护 void func1() { mymutex.lock(); num++; mymutex.unlock(); } //3月份的时候,公司有个新需求,我们写了个func1,共享数据othernum的访问,用mymutex保护 void func2() { mymutex.lock(); othernum++; mymutex.unlock(); } //5月份的时候,公司有了一个新需求,这个需求,有一部分代码用到了func1和func2,那么我们按照习惯会这么写: void func3() { mymutex.lock();//func3 代码 func1(); // func3 代码 func2(); mymutex.unlock();//func3 代码 } }; void main() { Teacher183 tea; thread functhread1(&Teacher183::func1, &tea); thread functhread2(&Teacher183::func2, &tea); thread functhread3(&Teacher183::func3, &tea); functhread1.join(); functhread2.join(); functhread3.join(); }
二。recursive_mutex--可以多次lock()写在一起,多次unlock()写在一起
class Teacher183 { public: recursive_mutex mymutex; int num; int othernum; //1月份的时候,有个需求,我们写了个func1,共享数据num的访问,用mymutex保护 void func1() { mymutex.lock(); num++; mymutex.unlock(); } //3月份的时候,公司有个新需求,我们写了个func1,共享数据othernum的访问,用mymutex保护 void func2() { mymutex.lock(); othernum++; mymutex.unlock(); } //5月份的时候,公司有了一个新需求,这个需求,有一部分代码用到了func1和func2,那么我们按照习惯会这么写: void func3() { mymutex.lock();//func3 代码 func1(); // func3 代码 func2(); mymutex.unlock();//func3 代码 } }; void main() { Teacher183 tea; thread functhread1(&Teacher183::func1, &tea); thread functhread2(&Teacher183::func2, &tea); thread functhread3(&Teacher183::func3, &tea); functhread1.join(); functhread2.join(); functhread3.join(); }