void threadPoolFunction(std::pair<TaskSchedulerTBB::ThreadPool*,size_t>* pair) { TaskSchedulerTBB::ThreadPool* pool = pair->first; size_t threadIndex = pair->second; g_barrier.wait(); pool->thread_loop(threadIndex); }
void TaskSchedulerTBB::ThreadPool::setNumThreads(size_t newNumThreads, bool startThreads) { Lock<MutexSys> lock(g_mutex); if (newNumThreads == 0) newNumThreads = getNumberOfLogicalThreads(); numThreads = newNumThreads; if (!startThreads && !running) return; running = true; size_t numThreadsActive = numThreadsRunning; mutex.lock(); numThreadsRunning = newNumThreads; mutex.unlock(); condition.notify_all(); /* start new threads */ for (size_t t=numThreadsActive; t<numThreads; t++) { if (t == 0) continue; auto pair = std::make_pair(this,t); threads.push_back(createThread((thread_func)threadPoolFunction,&pair,4*1024*1024,set_affinity ? t : -1)); g_barrier.wait(); } /* stop some threads if we reduce the number of threads */ for (ssize_t t=numThreadsActive-1; t>=ssize_t(numThreadsRunning); t--) { if (t == 0) continue; embree::join(threads.back()); threads.pop_back(); } }
bool run () { threadID.store(0); numFailed.store(0); size_t numThreads = getNumberOfLogicalThreads(); threadResults.resize(numThreads); barrier.init(numThreads+1); /* create threads */ std::vector<thread_t> threads; for (size_t i=0; i<numThreads; i++) threads.push_back(createThread((thread_func)thread_alloc,this)); /* run test */ for (size_t i=0; i<1000; i++) { for (size_t i=0; i<numThreads; i++) threadResults[i] = 0; barrier.wait(); barrier.wait(); for (size_t i=0; i<numThreads; i++) numFailed += threadResults[i] != i; } /* destroy threads */ for (size_t i=0; i<numThreads; i++) join(threads[i]); return numFailed == 0; }