12 pthread_attr_t joinable_attr;
16 Mutex() { pthread_mutex_init(&h, 0); }
17 ~Mutex() { pthread_mutex_destroy(&h); }
19 pthread_mutex_lock(&h); }
20 void unlock() { pthread_mutex_unlock(&h); }
23 static Handle*
Create(DWORD (WINAPI *method)(
void* param),
void* param) {
25 pthread_attr_t joinable_attr;
26 pthread_attr_init(&joinable_attr);
27 pthread_attr_setdetachstate(&joinable_attr, PTHREAD_CREATE_JOINABLE);
28 pthread_create(&h, &joinable_attr, method, param);
30 throw std::runtime_error(
"Failed to create processing thread.");
33 pthread_attr_destroy(&joinable_attr);
38 pthread_join((pthread_t)h, 0);
67 Mutex(
const char*name=0) : name(name?name:
"") {
69 h=CreateMutex(0,FALSE,0);
76 WaitForSingleObject(h, INFINITE);
84 void msg(
const char* m) {
85 if(name.length()>0 &&
trace) {
87 SNPRINTF(buf,
sizeof(buf),
"mutex %s: %s\n", name.c_str(), m);
88 OutputDebugString(buf);
106 throw std::runtime_error(
"Failed to create processing thread.");
115 return v.dwMajorVersion >= 6;
120 HANDLE h = (HANDLE)thread;
123 SetThreadPriority(h, bg ? THREAD_MODE_BACKGROUND_BEGIN : THREAD_MODE_BACKGROUND_END);
125 SetThreadPriority(h, bg ? THREAD_PRIORITY_BELOW_NORMAL : THREAD_PRIORITY_NORMAL);
129 WaitForSingleObject(h->
winhdl, INFINITE);
142 GetSystemInfo(&sysInfo);
143 return sysInfo.dwNumberOfProcessors;
161 operator T()
const {
return get(); };
163 void set(
const T& x) {
176 template<
typename TWorkItem,
typename TFunctor>
182 threads.resize(Nthreads);
185 for (
int i=0;i<Nthreads;i++)
205 bool r=work.empty() && inProgress==0;
211 for(
uint i=0;i<threads.size();i++)
219 while (!pool->
quit) {
233 bool r = !work.empty();
250 template<
typename TF>
257 for (
int i=0;i<count;i++) threadPool.
AddWork(i);
static bool RunningVistaOrBetter()
Atomic & operator=(const T &x)
ThreadPool(TFunctor f, int Nthreads=-1)
Mutex(const char *name=0)
std::list< TWorkItem > work
void ProcessArray(TWorkItem *items, int n)
void(* ThreadEntryPoint)(void *param)
static Handle * Create(ThreadEntryPoint method, void *param)
static void ThreadEntryPoint(void *param)
void parallel_for(int count, TF f)
std::vector< Threads::Handle * > threads
bool GetNewItem(TWorkItem &item)
Thread OS related code is abstracted into a simple "Threads" struct.
static DWORD WINAPI ThreadCaller(void *param)
static void WaitAndClose(Handle *h)
Threads::Handle ThreadHandle
void AddWork(TWorkItem w)
static void SetBackgroundPriority(Handle *thread, bool bg)
static void Sleep(int ms)
ThreadEntryPoint callback