20
int GetThreadWork (void)
27
if (dispatch == workcount)
33
f = 10*dispatch / workcount;
49
void (*workfunction) (int);
51
void ThreadWorkerFunction (int threadnum)
57
work = GetThreadWork ();
60
//printf ("thread %i, work %i\n", threadnum, work);
65
void RunThreadsOnIndividual (int workcnt, qboolean showpacifier, void(*func)(int))
70
RunThreadsOn (workcnt, showpacifier, ThreadWorkerFunction);
75
===================================================================
79
===================================================================
88
CRITICAL_SECTION crit;
91
void ThreadSetDefault (void)
95
if (numthreads == -1) // not set manually
97
GetSystemInfo (&info);
98
numthreads = info.dwNumberOfProcessors;
99
if (numthreads < 1 || numthreads > 32)
103
qprintf ("%i threads\n", numthreads);
107
void ThreadLock (void)
111
EnterCriticalSection (&crit);
113
Error ("Recursive ThreadLock\n");
117
void ThreadUnlock (void)
122
Error ("ThreadUnlock without lock\n");
124
LeaveCriticalSection (&crit);
132
void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int))
134
int threadid[MAX_THREADS];
135
HANDLE threadhandle[MAX_THREADS];
139
start = I_FloatTime ();
143
pacifier = showpacifier;
147
// run threads in parallel
149
InitializeCriticalSection (&crit);
157
for (i=0 ; i<numthreads ; i++)
159
threadhandle[i] = CreateThread(
160
NULL, // LPSECURITY_ATTRIBUTES lpsa,
162
(LPTHREAD_START_ROUTINE)func, // LPTHREAD_START_ROUTINE lpStartAddr,
163
(LPVOID)i, // LPVOID lpvThreadParm,
164
0, // DWORD fdwCreate,
168
for (i=0 ; i<numthreads ; i++)
169
WaitForSingleObject (threadhandle[i], INFINITE);
171
DeleteCriticalSection (&crit);
174
end = I_FloatTime ();
176
printf (" (%i)\n", end-start);
183
===================================================================
187
===================================================================
195
void ThreadSetDefault (void)
197
if (numthreads == -1) // not set manually
206
pthread_mutex_t *my_mutex;
208
void ThreadLock (void)
211
pthread_mutex_lock (my_mutex);
214
void ThreadUnlock (void)
217
pthread_mutex_unlock (my_mutex);
226
void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int))
229
pthread_t work_threads[MAX_THREADS];
230
pthread_addr_t status;
231
pthread_attr_t attrib;
232
pthread_mutexattr_t mattrib;
235
start = I_FloatTime ();
239
pacifier = showpacifier;
243
setbuf (stdout, NULL);
247
my_mutex = malloc (sizeof(*my_mutex));
248
if (pthread_mutexattr_create (&mattrib) == -1)
249
Error ("pthread_mutex_attr_create failed");
250
if (pthread_mutexattr_setkind_np (&mattrib, MUTEX_FAST_NP) == -1)
251
Error ("pthread_mutexattr_setkind_np failed");
252
if (pthread_mutex_init (my_mutex, mattrib) == -1)
253
Error ("pthread_mutex_init failed");
256
if (pthread_attr_create (&attrib) == -1)
257
Error ("pthread_attr_create failed");
258
if (pthread_attr_setstacksize (&attrib, 0x100000) == -1)
259
Error ("pthread_attr_setstacksize failed");
261
for (i=0 ; i<numthreads ; i++)
263
if (pthread_create(&work_threads[i], attrib
264
, (pthread_startroutine_t)func, (pthread_addr_t)i) == -1)
265
Error ("pthread_create failed");
268
for (i=0 ; i<numthreads ; i++)
270
if (pthread_join (work_threads[i], &status) == -1)
271
Error ("pthread_join failed");
276
end = I_FloatTime ();
278
printf (" (%i)\n", end-start);
285
===================================================================
289
===================================================================
296
#include <abi_mutex.h>
297
#include <sys/types.h>
298
#include <sys/prctl.h>
304
void ThreadSetDefault (void)
306
if (numthreads == -1)
307
numthreads = prctl(PR_MAXPPROCS);
308
printf ("%i threads\n", numthreads);
310
usconfig (CONF_INITUSERS, numthreads);
314
void ThreadLock (void)
319
void ThreadUnlock (void)
330
void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int))
333
int pid[MAX_THREADS];
336
start = I_FloatTime ();
340
pacifier = showpacifier;
344
setbuf (stdout, NULL);
348
for (i=0 ; i<numthreads-1 ; i++)
350
pid[i] = sprocsp ( (void (*)(void *, size_t))func, PR_SALL, (void *)i
352
// pid[i] = sprocsp ( (void (*)(void *, size_t))func, PR_SALL, (void *)i
357
Error ("sproc failed");
363
for (i=0 ; i<numthreads-1 ; i++)
368
end = I_FloatTime ();
370
printf (" (%i)\n", end-start);
377
=======================================================================
381
=======================================================================
388
void ThreadSetDefault (void)
393
void ThreadLock (void)
397
void ThreadUnlock (void)
406
void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int))
414
pacifier = showpacifier;
415
start = I_FloatTime ();
418
setbuf (stdout, NULL);
422
end = I_FloatTime ();
424
printf (" (%i)\n", end-start);