#include "../smartptr/smart_ptr.hpp"
#include "../smartptr/sync_wrapper.hpp"
smart_ptr<mutex_wrapper<vector<int> >, copy_on_write_policy<ref_link_policy, intrusive_lock_policy> > SharedSmartPointer = new mutex_wrapper<vector<int> >;
int ThreadIDIndex = 10;
void example_intrusive_lock_policy_usage(void*)
{
const size_t MaxSizeAllowed = 2000000;
int ThreadId = ThreadIDIndex++;
int SleepTime = rand()% 30;
int QtyToAdd = rand()% 1000;
Sleep(SleepTime);
for(;;)
{
int ValidateResults = 0;
scope_lock MyLocked = SharedSmartPointer;
size_t StartPos = SharedSmartPointer->size();
for(int i = 0;i < QtyToAdd;++i)
{
int AddValue = rand()% 9999;
ValidateResults += AddValue;
SharedSmartPointer->push_back(AddValue);
}
int ValidateResults_2nd = 0;
for(int i = 0;i < QtyToAdd;++i)
{
ValidateResults_2nd += (*SharedSmartPointer)[StartPos + i];
}
if (ValidateResults != ValidateResults_2nd)
{
cout << "ID("<< ThreadId << "): Error :" <<
" V1 = " << ValidateResults << " V2 = " << ValidateResults_2nd << endl;
system("pause");
exit(-1);
}
if (SharedSmartPointer->size() > MaxSizeAllowed)
{
cout << "ThreadId(" << ThreadId << "): Clearing Vect, size = " << (int)SharedSmartPointer->size() << endl;
SharedSmartPointer->clear();
}
}
}
void Test_intrusive_lock_policy()
{
srand((unsigned) time(NULL));
const int QtyTestThreads = 20;
cout << "Starting Synchronize Smart Pointer Test" << endl;
for(int i = 0;i < QtyTestThreads;++i)
_beginthread(example_intrusive_lock_policy_usage, 0, NULL);
for(;;) Sleep(9000);
}