#include #include #include #include #include #include #include using namespace std::chrono; #define DEBUG false #if DEBUG #define DEBUG_MSG(str) do { std::cout << str << std::endl; } while( false ) #else #define DEBUG_MSG(str) do { } while ( false ) #endif #define OP_COUNT 1000000 #define THREADS 4 int done_count = 0; std::mutex done_mutex; ADTOperationQueue * op_queue = new ADTOperationQueue(); std::vector generate_operations_uniform(){ operation default_operation = create_operation(methodname::push, 0); std::vector operations(OP_COUNT, default_operation); int stack_size = 0; for (auto op = operations.begin(); op != operations.end(); op++) { switch (rand() % 3) { case 0: if (stack_size > 0) { op->method = methodname::pop; stack_size--; break; } case 1: op->method = methodname::push; op->value = rand() % 20; stack_size++; break; default: op->method = methodname::size; break; } } return operations; } void run_worker(Stack* stack) { std::vector operations = generate_operations_uniform(); std::cout << "Worker: start" << std::endl; long op_counter = 0; for (operation op : operations) { switch (op.method) { case methodname::pop: stack->pop(); break; case methodname::push: stack->push(op.value); break; default: stack->size(); break; } } done_mutex.lock(); std::cout << "Worker: done" << std::endl; done_count ++; done_mutex.unlock(); } void run_checker() { ADTStack * adt_stack = new ADTStack(); while(true) { size_t queue_size = op_queue->size(); if (done_count >= THREADS && queue_size == 0) { break; } else if(queue_size != 0){ operation op = op_queue->dequeue(); adt_stack->do_op(&op); } } std::cout << std::endl << "Done checking operations" << std::endl; } int main(){ Stack * s = new TreiberStack(op_queue); std::thread *worker= new std::thread[THREADS]; for (int i=0;i