From b5153faf6b39fee9cc17da22d1fcfe630d6663ca Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 25 Mar 2024 00:34:45 +0800 Subject: [PATCH] added DataChainTest2.cpp and then it tested a bug in DataChain class. --- CMakeLists.txt | 3 + datatype/DataChainTest.cpp | 15 +++-- datatype/DataChainTest2.cpp | 130 ++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 datatype/DataChainTest2.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c4dab6f..cefc9f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,9 @@ set_example_project_folder("DataType/DataArray" StackPoolTest) add_executable(DataChainTest datatype/DataChainTest.cpp) cm_example_project("DataType/DataArray" DataChainTest) +add_executable(DataChainTest2 datatype/DataChainTest2.cpp) +cm_example_project("DataType/DataArray" DataChainTest2) + #################################################################################################### add_executable(1_ActiveIDManagerTest datatype/ActiveIDManagerTest.cpp) diff --git a/datatype/DataChainTest.cpp b/datatype/DataChainTest.cpp index 3ca2344..5ddbd2e 100644 --- a/datatype/DataChainTest.cpp +++ b/datatype/DataChainTest.cpp @@ -58,16 +58,16 @@ int os_main(int,os_char **) dc.Release(un[0]); out_data_chain(&dc); - cout<<"Release 5 "; - dc.Release(un[5]); + cout<<"Release 7 "; + dc.Release(un[7]); out_data_chain(&dc); cout<<"Release 9 "; dc.Release(un[9]); out_data_chain(&dc); - cout<<"Release 6 "; - dc.Release(un[6]); + cout<<"Release 4 "; + dc.Release(un[4]); out_data_chain(&dc); cout<<"---------------------------------------------------------------------------------"< +#include +#include +#include +#include + +using namespace std; +using namespace hgl; + +void out_data_chain(DataChain *dc) +{ + DataChain::ChainNode *start =dc->GetStartNode(); + DataChain::ChainNode *end =dc->GetEndNode(); + + DataChain::ChainNode *node =start; + + cout<<"Data Chain: "; + + while(node) + { + cout<<"["<start<<","<count<<"]"; + + if(node==end) + break; + + node=node->next; + } + + cout< dis(1,BLOCK_SIZE); + uniform_int_distribution dis_un_count(BLOCK_SIZE/10,BLOCK_SIZE/4); + uniform_int_distribution dis_block_count(1,BLOCK_SIZE/10); + + List user_node_list; + int free_count=dc.GetFreeCount(); + + do + { + int ubc=hgl_min(dis_block_count(gen),free_count); + + DataChain::UserNode *un=dc.Acquire(ubc); + + if(!un) //失败了 + { + cout<<"Acquire UserNode Error! FreeCount "<GetStart()<<","<GetCount()<<"] "; + } + + out_data_chain(&dc); + + user_node_list.Add(un); + }while(free_count>0); + + bernoulli_distribution dis_op(0.5); //使用伯努利分布随机数产生操作类型,50%的概率是Acquire,50%的概率是Release + + const int top_op_count=dis_un_count(gen); //最上层操作次数 + int op_run_count=0; //执行成功的次数 + + do + { + bool op=dis_op(gen); //这次是acquire还是release + int op_count=dis_un_count(gen); //操作数量 + + if(op) //acquire + { + op_count=hgl_min(op_count,dc.GetFreeCount()); + + if(op_count<=0) + continue; + + DataChain::UserNode *un=dc.Acquire(op_count); + + if(un) + { + cout<<"Acquire ["<GetStart()<<","<GetCount()<<"] "; + + user_node_list.Add(un); + } + else + { + cout<<"Acquire "<GetStart()<<","<GetCount()<<"] "; + + user_node_list.Delete(pos); + ++op_run_count; + } + else + { + cout<<"Release UserNode "<