使用 lock_guard

时间:2021-04-05 10:32:36

标签: c++ synchronization locking p2p lock-guard

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 在访问子跟踪器的对等节点之间进行同步。有一些对等点,其中一个对等点也是子跟踪器。 subtracker getPeer() 方法的工作是计算包含请求对等点所需的特定数据包的最近对等点。 packetToPeersMapping 中基本上需要同步,它包含有关具有特定数据包的对等方的信息。每个对等点都是一个单独的线程,并为其分配了一个子跟踪器。

理想情况下,如果一个peer需要一个数据包,它会调用getPeer()方法并返回最近的peer。在运行代码时,有时即使当前对等方没有必要的数据包,getPeer() 方法也会返回当前对等方作为最近的具有该数据包的对等方。我认为我使用 lock_guard

的方式有问题

0 个答案:

没有答案
相关问题