下面我们有容器的数据。我们希望多个线程能够搜索Container并获取Data对象。这种编码线程是否安全,死锁安全?
#include <boost/thread.hpp>
using boost::shared_ptr;
using boost::mutex;
using boost::lock_guard;
using std::string;
class CData
{
public:
bool find(string& value, const string& fieldName)
{
lock_guard<mutex> guard(m_lock);
auto it=m_data.find(fieldName);
if(it!=m_data.end())
{
value=it->second;
return true;
}
return false;
}
CData(const CData& rhs)
{
lock_guard<mutex> guard(rhs.m_lock);
m_data=rhs.m_data;
}
CData& operator=(const CData& rhs)
{
if (this == &rhs)
{
return *this;
}
mutex* lock1;
mutex* lock2;
if(this<&rhs)
{
lock1=&m_lock;
lock2=&rhs.m_lock;
}
else
{
lock1=&rhs.m_lock;
lock2=&m_lock;
}
lock_guard<mutex> guard1(*lock1);
lock_guard<mutex> guard2(*lock2);
m_data=rhs.m_data;
}
private:
std::map<string,string> m_data;
mutable mutex m_lock;
};
容器在地图中包含共享点。不同的线程将查找容器中的对象并查找对象中的字段。
class CDataContainer
{
public:
CDataContainer* instance()
{
static CDataContainer* s_instance;
static mutex s_instanceLock;
lock_guard<mutex> guard(s_instanceLock);
if(!s_instance)
{
s_instance=new CDataContainer;
}
return s_instance;
}
void insert(const string& key, const shared_ptr<CData>& data)
{
lock_guard<mutex> guard(m_lock);
m_key2data[key]=data;
}
void erase(const string& key)
{
lock_guard<mutex> guard(m_lock);
m_key2data.erase(key);
}
bool find(shared_ptr<CData>& data,const string& key)
{
lock_guard<mutex> guard(m_lock);
auto it=m_key2data.find(key);
if(it!=m_key2data.end())
{
data=it->second;
return true;
}
return false;
}
private:
CDataContainer()
}
mutex m_lock;
std::map<string,shared_ptr<CData>> m_key2data;
};
对于初学者来说,只有'p0'和'p1'是同一个数组对象的一部分才会定义'p0()(p0,p1)',尽管这个操作是定义的,即使'p0'和'p1'不是同一个数组的一部分。 –
2014-10-04 19:21:31
使用该地址确保锁定顺序具有创造性,但您可能不想尝试实现您自己的STL类型的并发版本。这可能是[codereview](http://codereview.stackexchange.com)更好的帖子。 – Jason 2014-10-04 19:37:52
好了解。我必须为每个CData使用一个唯一的ID,这不应该太难。 – steviekm3 2014-10-04 20:00:28