boost :: bimap跳过插入

时间:2015-12-14 09:57:01

标签: c++ multithreading boost

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

执行上述任务有三个类和一个boost :: bimap。

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

B类 - 根据持有者推送的任何数据将数据转发到第三方服务器。这个类有单个实例。

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

boost :: bimap In_bimap - 为了基于UserID分离数据,在“A类”中,正在从“struct X”生成一个hashkey,其中包含Token Number,Price,Qty& Buy_Sell指标并存储为KeyID,UserID为值;

在In_bimap中生成并存储哈希之后,需要将结构推送到由B类完成的服务器。因此,“struct X”正在向量中推送。

一旦第三方服务器收到数据,它就会通过向其添加更多元素来响应相同的数据包,即OrderNumber。该分组由C类接收,C类在接收后基于“令牌号,价格,数量和购买_指示符”生成HashKey。在100个中,我可以说96次它完美无缺,我在In_bimap中搜索Key并获得UserID以提前推送数据,但很多时候在bimap中找不到Key。

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

In_bimap的定义:

typedef boost::bimap< long,boost::bimaps::multiset_of< int>> In_bimap;

In_bimap _InPF;

typedef In_bimap::value_type In_position;

这里bimap的第二部分有multiset,因为同样的密钥也可以从其他客户端获得,但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中检索数据的方法:

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;
}

如果找不到Key,GetRecord将返回零。特定记录的用户不会得到发送数据包发生的任何信息。

HashKey生成例程是[http://de.cppreference.com/w/cpp/utility/hash]

的最后一个示例的更改版本

请帮忙。

0 个答案:

没有答案