验证C++ map返回引用的线程安全问题
现象:没出现线程安全问题。
结论:这么写是线程安全的。
// 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;
}