C++ boost::bimap跳过插入

C++ boost::bimap跳过插入,c++,multithreading,boost,C++,Multithreading,Boost,在一个场景中,有两个生产者和两个消费者使用boost::bimap对象,其中一个生产者在bimap对象中插入数据,另一个生产者更新相同的数据(如果找到) 完成上述任务涉及三个类和一个boost::bimap A类-包含一些生成数据并在单独线程上运行的策略。根据连接的客户端数量,可以有多个单独的“A类”副本运行 B类-基于压入支架中的任何数据将数据转发给第三方服务器。这个类只有一个实例 C类-它从第三方服务器接收数据,并在单独的线程上运行。这个类只有一个实例 boost::bimap In_bim

在一个场景中,有两个生产者和两个消费者使用boost::bimap对象,其中一个生产者在bimap对象中插入数据,另一个生产者更新相同的数据(如果找到)

完成上述任务涉及三个类和一个boost::bimap

A类-包含一些生成数据并在单独线程上运行的策略。根据连接的客户端数量,可以有多个单独的“A类”副本运行

B类-基于压入支架中的任何数据将数据转发给第三方服务器。这个类只有一个实例

C类-它从第三方服务器接收数据,并在单独的线程上运行。这个类只有一个实例

boost::bimap In_bimap-根据用户ID对数据进行分段,在“A类”中,从“struct X”生成一个hashkey,该hashkey包含令牌号、价格、数量和买卖指示符,并以用户ID作为值存储为key

在_bimap中生成并存储散列后,需要将结构推送到服务器,这是由类B完成的。因此,“结构X”被推送到向量中

一旦第三方服务器接收到数据,它将通过向其添加更多元素(即OrderNumber)来响应相同的数据包。该数据包由C类接收,C类在接收后根据“令牌编号、价格、数量和买卖指示器”生成哈希键。100次中,我可以说96次它工作得很完美,我在_bimap中搜索密钥,并获得用户ID以向前推送数据,但有很多次在bimap中找不到密钥

我的日志记录显示“Class A”生成了HashKey并试图插入数据,但插入前后的计数是相同的。这意味着没有插入任何数据

In_bimap的定义:

typedef boost::bimap< long,boost::bimaps::multiset_of< int>> In_bimap;
int GetRecord(long Key)
{


    int popped_value;

    boost::mutex::scoped_lock lock(the_mutex);



    In_bimap::left_map& AllKey = _InPF.left;
    auto iter_pair = AllKey.equal_range(Key);
    for (auto it = iter_pair.first; it != iter_pair.second;++it)
    {
        popped_value = it->second;

        break;
    }
    if(popped_value ==0 )
    {
        cout << "No record found"<<endl;
    }
lock.unlock();
the_condition_variable.notify_one();


    return popped_value;
}
在这里,bimap的第二部分有多个集,因为同一个密钥也可以从其他客户端获得,但userid是唯一的。这意味着对于同一个密钥,它可能包含多个userid

我用于将记录添加到In_bimap的方法:

void AddRecord(long Key, int Value)
{
    boost::mutex::scoped_lock lock(the_mutex);

     _InPF.insert(In_position(Key,Value));


     lock.unlock();
    the_condition_variable.notify_one();


}
用于从In_bimap检索数据的方法:

typedef boost::bimap< long,boost::bimaps::multiset_of< int>> In_bimap;
int GetRecord(long Key)
{


    int popped_value;

    boost::mutex::scoped_lock lock(the_mutex);



    In_bimap::left_map& AllKey = _InPF.left;
    auto iter_pair = AllKey.equal_range(Key);
    for (auto it = iter_pair.first; it != iter_pair.second;++it)
    {
        popped_value = it->second;

        break;
    }
    if(popped_value ==0 )
    {
        cout << "No record found"<<endl;
    }
lock.unlock();
the_condition_variable.notify_one();


    return popped_value;
}
intgetrecord(长键)
{
int-popped_值;
boost::mutex::作用域的_锁锁(_互斥锁);
In_bimap::left_map&AllKey=\u InPF.left;
自动iter_对=所有键。相等的_范围(键);
for(自动it=iter\U对。第一;it!=iter\U对。第二;++it)
{
弹出的_值=它->秒;
打破
}
如果(弹出的_值==0)
{

难道我认为您没有正确使用条件变量吗?您在哪里对条件变量执行等待操作?此外,我认为您的bimap不符合您的要求。您的左集合被限制为一个实例。对现有密钥的第二次插入将失败。您的第一点是正确的,我没有注意到这一点it条件。我正在尝试插入wait with condition。对于您的第二个建议,我应该在这两个部分上都添加multiset,还是有其他方法?还不完全清楚您真正想要实现什么,但是如果您想要针对同一个客户id存储多个事件,那么显然必须允许客户id存在更多地图中的一次-这意味着左手边有多个集合,不是吗?我想针对同一个HashKey存储多个事件。这意味着同一个HashKey可以有多个clientid。