проблема при доступе к одному и тому же объекту из нескольких потоков одновременно с использованием 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 для синхронизации между одноранговыми узлами, обращающимися к субтрекерам. Есть несколько пиров, и один из них также является субтрекером. Задача метода вычитания - вычислить ближайшего однорангового узла, который содержит определенный пакет, который нужен запрашивающему одноранговому узлу. Синхронизация в основном нужна в packetToPeersMapping, который содержит информацию о партнерах, имеющих конкретный пакет. Каждый одноранговый узел является отдельным потоком, и ему назначен вычитатель.

В идеале, если одноранговому узлу нужен пакет, он вызовет метод, и будет возвращен ближайший одноранговый узел. После запуска кода, иногда, даже если текущий одноранговый узел не имеет необходимого пакета, getPeer()метод возвращает текущего однорангового узла как ближайшего однорангового узла, имеющего пакет. Я думаю, что что-то не так с тем, как я использую lock_guard

0 ответов

Другие вопросы по тегам