在一个场景中,有两个生产者和两个消费者使用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]
的最后一个示例的更改版本请帮忙。