// This test routine is only called by the master thread (thread_num = 0). bool team_example(void) { bool ok = true; size_t num_threads = NUMBER_THREADS; // Check that no memory is in use or avialable at start // (using thread_alloc in sequential mode) size_t thread_num; for(thread_num = 0; thread_num < num_threads; thread_num++) { ok &= thread_alloc::inuse(thread_num) == 0; ok &= thread_alloc::available(thread_num) == 0; } // initialize work_all_ for(thread_num = 0; thread_num < num_threads; thread_num++) { // allocate separate memory for this thread to avoid false sharing size_t min_bytes(sizeof(work_one_t)), cap_bytes; void* v_ptr = thread_alloc::get_memory(min_bytes, cap_bytes); work_all_[thread_num] = static_cast<work_one_t*>(v_ptr); // incase this thread's worker does not get called work_all_[thread_num]->ok = false; // parameter that defines the work for this thread work_all_[thread_num]->x = double(thread_num) + 1.; } ok &= team_create(num_threads); ok &= team_work(worker); ok &= team_destroy(); // go down so that free memrory for other threads before memory for master thread_num = num_threads; while(thread_num--) { // check that this thread was ok with the work it did ok &= work_all_[thread_num]->ok; // delete problem specific information void* v_ptr = static_cast<void*>( work_all_[thread_num] ); thread_alloc::return_memory( v_ptr ); // check that there is no longer any memory inuse by this thread // (for general applications, the master might still be using memory) ok &= thread_alloc::inuse(thread_num) == 0; // return all memory being held for future use by this thread thread_alloc::free_available(thread_num); } return ok; }
bool simple_ad(void) { bool ok = true; size_t num_threads = NUMBER_THREADS; // Check that no memory is in use or avialable at start // (using thread_alloc in sequential mode) size_t thread_num; for(thread_num = 0; thread_num < num_threads; thread_num++) { ok &= thread_alloc::inuse(thread_num) == 0; ok &= thread_alloc::available(thread_num) == 0; } // initialize info_all problem_specific *info, *info_all[NUMBER_THREADS]; for(thread_num = 0; thread_num < num_threads; thread_num++) { // problem specific information size_t min_bytes(sizeof(info)), cap_bytes; void* v_ptr = thread_alloc::get_memory(min_bytes, cap_bytes); info = static_cast<problem_specific*>(v_ptr); info->x = double(thread_num) + 1.; info_all[thread_num] = info; } ok &= run_all_workers(num_threads, info_all); // go down so that free memory for other threads before memory for master thread_num = num_threads; while(thread_num--) { // delete problem specific information void* v_ptr = static_cast<void*>( info_all[thread_num] ); thread_alloc::return_memory( v_ptr ); // check that there is no longer any memory inuse by this thread ok &= thread_alloc::inuse(thread_num) == 0; // return all memory being held for future use by this thread thread_alloc::free_available(thread_num); } return ok; }