Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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,计算时间的表达式}; } } //其他代码 }_C++_Synchronization_Locking_P2p_Lock Guard - Fatal编程技术网

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,计算时间的表达式}; } } //其他代码 }

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,计算时间的表达式}; } } //其他代码 },c++,synchronization,locking,p2p,lock-guard,C++,Synchronization,Locking,P2p,Lock Guard,我正在使用lock_guard在访问子tracker的对等方之间进行同步。有一些对等方,其中一个对等方也是子tracker。子trackergetPeer()的作业方法是计算最近的对等点,该对等点包含请求对等点所需的特定数据包。在packetToPeersMapping中基本上需要同步,该映射包含关于具有特定数据包的对等点的信息。每个对等点是一个单独的线程,并为其分配了一个子跟踪程序 理想情况下,如果对等方需要数据包,它将调用getPeer()方法,并返回最近的对等方。在运行代码时,有时即使当前

我正在使用lock_guard在访问子tracker的对等方之间进行同步。有一些对等方,其中一个对等方也是子tracker。子tracker
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
}