uniquelock比guardload重量级一些,但是灵活一些. uniquelock的第一个版本
class LogFile {
std::mutex _mu;
ofstream _f;
public:
LogFile()
{
_f.open("log.txt");
}
void shared_print(string id, int value) {
std::unique_lock<mutex> locker(_mu);
cout << "From " << id << ": " << value << endl;
}
};
uniquelock的第二个版本,可以延迟锁,也可以用好几次
class LogFile {
std::mutex _mu;
ofstream _f;
public:
LogFile()
{
_f.open("log.txt");
}
void shared_print(string id, int value) {
std::unique_lock<mutex> locker(_mu, std::defer_lock);
locker.lock();
cout << "From " << id << ": " << value << endl;
locker.unlock();
locker.lock();
cout << "From " << id << ": " << value << endl;
locker.unlock();
}
};
lazy initilazation
实现只有第一次写日志的时候才打开日志文件,就需要每次都给锁.为了避免这种浪费,使用STL设计好的延迟初始化接口,这个初始化接口是线程安全的.
class LogFile {
std::mutex _mu;
std::mutex _mu_open;
ofstream _f;
once_flag _flag;
public:
LogFile()
{
}
void shared_print(string id, int value) {
//{
// std::unique_lock<mutex> locker2(_mu_open);
// if (!_f.is_open()) {
// _f.open("log.txt");
// }
//}
std::call_once(_flag, [&]() {_f.open("log.txt"); });
std::unique_lock<mutex> locker(_mu, std::defer_lock);
locker.lock();
cout << "From " << id << ": " << value << endl;
locker.unlock();
}
};