现象:没出现线程安全问题。
结论:这么写是线程安全的。
// ConsoleApplication12.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <mutex>
#include <iostream>
#include <unordered_map>
using namespace std;
class spin_lock
{
public:
spin_lock()
{}
void lock()
{
_mutex.lock();
}
void unlock()
{
_mutex.unlock();
}
private:
std::mutex _mutex;
};
class auto_lock
{
public:
auto_lock(spin_lock* lock)
{
_lock = lock;
_lock->lock();
}
~auto_lock()
{
_lock->unlock();
}
private:
spin_lock* _lock;
};
spin_lock m_lock;
struct A
{
int a;
int b;
std::string c;
char d[1024];
};
class my_hash_map
{
public:
std::unordered_map<int, A> m;
A& operator[] (const int& k)
{
auto_lock lock(&m_lock);
return m[k];
}
bool erase(const int& k)
{
auto_lock lock(&m_lock);
return m.erase(k);
}
public:
};
my_hash_map m;
void f()
{
m[0].a = -1;
while (1)
{
for (int i = 0; i < 1000000; ++i)
{
if (m[0].a != -1)
{
cout << "========================= m[0].a != -1" << endl;
}
}
cout << "--" << endl;
}
}
int main()
{
std::thread t = thread(f);
while (1)
{
for (int i = 1; i < 1000000; ++i)
{
m[i].a = i - 1;
}
for (int i = 1; i < 1000000; ++i)
{
m.erase(i);
}
}
return 0;
}