C++ 使用lock_guard从多个线程同时访问同一对象时出现问题 Peer*Subtracker::getPeer(int-packetNum,Peer*p,Peer*nearestP) { 锁紧护罩(此->m); 双d=DBL_最大值; 用于(自动it:packetToPeersMapping[packetNum]) { 双dTemp=sqrt(pow(p->x-it->x,2)+pow(p->y-(it)->y,2)); if(dTemp getPeer(i,this,peer); 2.插入(i); packetTime[i]={peer->ID,计算时间的表达式}; } } //其他代码 }
我正在使用lock_guard在访问子tracker的对等方之间进行同步。有一些对等方,其中一个对等方也是子tracker。子trackerC++ 使用lock_guard从多个线程同时访问同一对象时出现问题 Peer*Subtracker::getPeer(int-packetNum,Peer*p,Peer*nearestP) { 锁紧护罩(此->m); 双d=DBL_最大值; 用于(自动it:packetToPeersMapping[packetNum]) { 双dTemp=sqrt(pow(p->x-it->x,2)+pow(p->y-(it)->y,2)); if(dTemp getPeer(i,this,peer); 2.插入(i); packetTime[i]={peer->ID,计算时间的表达式}; } } //其他代码 },c++,synchronization,locking,p2p,lock-guard,C++,Synchronization,Locking,P2p,Lock Guard,我正在使用lock_guard在访问子tracker的对等方之间进行同步。有一些对等方,其中一个对等方也是子tracker。子trackergetPeer()的作业方法是计算最近的对等点,该对等点包含请求对等点所需的特定数据包。在packetToPeersMapping中基本上需要同步,该映射包含关于具有特定数据包的对等点的信息。每个对等点是一个单独的线程,并为其分配了一个子跟踪程序 理想情况下,如果对等方需要数据包,它将调用getPeer()方法,并返回最近的对等方。在运行代码时,有时即使当前
getPeer()的作业
方法是计算最近的对等点,该对等点包含请求对等点所需的特定数据包。在packetToPeersMapping
中基本上需要同步,该映射包含关于具有特定数据包的对等点的信息。每个对等点是一个单独的线程,并为其分配了一个子跟踪程序
理想情况下,如果对等方需要数据包,它将调用
getPeer()
方法,并返回最近的对等方。在运行代码时,有时即使当前对等方没有必要的数据包,也会返回getPeer()
方法将当前对等方作为拥有数据包的最近对等方返回。我认为我使用锁护的方式有问题。不幸的是,由于显示的代码不符合a的要求,不太可能有人能告诉你任何事情。如果两个对等方
在一起会发生什么状态调用subtracker->getPeer(i,this,peer);
的值与i
的值相同(如果可能的话)?它们能否返回相同的peer*
?如果是,您可能有竞争条件。但确实需要查看更多的代码——最好是一个。
Peer* Subtracker::getPeer(int packetNum, Peer* p, Peer* nearestP)
{
lock_guard<mutex> guard(this->m);
double d = DBL_MAX;
for(auto it:packetToPeersMapping[packetNum])
{
double dTemp = sqrt(pow(p->x - it->x, 2) + pow(p->y - (it)->y, 2));
if(dTemp <= d)
{
nearestP = it;
}
}
packetToPeersMapping[packetNum].push_back(p);
return nearestP;
}
void Peer::operate()
{
// some initial code
for(int i=0;i<NUM_PACKETS;i++)
{
if(packets.find(i)!=packets.end())
{
// Packet already with peer do nothing
packetTime[i] = {this->ID, 0};
}
else
{
Peer *peer = nullptr;
peer = subtracker->getPeer(i, this, peer);
packets.insert(i);
packetTime[i] = {peer->ID, expression to calculate time};
}
}
// SOME OTHER CODE
}