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
}
我正在使用 lock_guard 在访问子跟踪器的对等方之间进行同步。有一些对等点,其中一个对等点也是子跟踪器。subtrackergetPeer()
方法的工作是计算最近的对等点,其中包含请求对等点需要的某个数据包。中基本上需要同步packetToPeersMapping
,其中包含有关具有特定数据包的对等方的信息。每个对等点都是一个单独的线程,并分配有一个子跟踪器。
理想情况下,如果一个对等点需要一个数据包,它将调用该getPeer()
方法并返回最近的对等点。在运行代码时,有时即使当前对等方没有必要的数据包,该getPeer()
方法也会返回当前对等方作为最近的对等方拥有数据包。我认为我使用lock_guard的方式有问题