1 带普通互斥锁的多线程案例
#include<iostream>
#include<thread>
#include<mutex>
using namespace std;
class X
{
int* _p;
mutex m1;
public:
X(int* p = nullptr) :_p(p) {}
~X() { if (_p) delete _p; }
void read()
{
m1.lock();
if (_p)
cout << "werggvgvdfvgfsdvytf value:" << *_p << endl;
else
cout << "Is NULL !" << endl;
m1.unlock();
}
void reset()
{
m1.lock();
cout << "resetting..." << endl;
if (_p)
{
delete _p;
_p = nullptr;
}
cout << "resetting done!" << endl;
m1.unlock();
}
void set(int x)
{
m1.lock();
if (_p)
*_p = x;
else
_p = new int(x);
m1.unlock();
}
};
int main()
{
int* pint = new int(77);
X* px1 = new X(pint);
thread t1(&X::read, px1), t2(&X::reset, px1);
t1.detach();
t2.detach();
px1->read();
system("pause");
return 0;
}
运行结果:
或:
2 lock_gard/unique_lock 自动锁
其中lock_guard是对lock的轻量化封装,构造函数内有lock(),析构函数有unlock(),unique_lock功能更多,但是较慢较大。
void read()
{
lock_guard<mutex> lk(m1);//声明一个lock_guard变量lk,模板参数类型为mutex,参数为mutex类型的m1.
if (_p)
cout << "werggvgvdfvgfsdvytf value:" << *_p << endl;
else
cout << "Is NULL !" << endl;
}
void reset()
{
lock_guard<mutex> lk(m1);
cout << "resetting..." << endl;
if (_p)
{
delete _p;
_p = nullptr;
}
cout << "resetting done!" << endl;
}
void set(int x)
{
lock_guard<mutex> lk(m1);
if (_p)
*_p = x;
else
_p = new int(x);
}
结果与上一致。