commit | 52a2f5706db7f9f805c2e0b5bfc56477b08b841a | [log] [tgz] |
---|---|---|
author | Marat Dukhan <maratek@gmail.com> | Fri Apr 10 16:49:59 2020 -0700 |
committer | Marat Dukhan <maratek@gmail.com> | Fri Apr 10 16:49:59 2020 -0700 |
tree | 6f464f57c6da6f1c936782a673a501a81616df72 | |
parent | 8f8dd879d20af72cf11344aa432f1cab21630f67 [diff] |
Fix race condition in Windows implementation The command event for the next command must be reset before write-release of the new command, because as soon as the worker threads observe the new command, they may complete it and switch to waiting on the next command event
pthreadpool is a portable and efficient thread pool implementation. It provides similar functionality to #pragma omp parallel for
, but with additional features.
The following example demonstates using the thread pool for parallel addition of two arrays:
static void add_arrays(struct array_addition_context* context, size_t i) { context->sum[i] = context->augend[i] + context->addend[i]; } #define ARRAY_SIZE 4 int main() { double augend[ARRAY_SIZE] = { 1.0, 2.0, 4.0, -5.0 }; double addend[ARRAY_SIZE] = { 0.25, -1.75, 0.0, 0.5 }; double sum[ARRAY_SIZE]; pthreadpool_t threadpool = pthreadpool_create(0); assert(threadpool != NULL); const size_t threads_count = pthreadpool_get_threads_count(threadpool); printf("Created thread pool with %zu threads\n", threads_count); struct array_addition_context context = { augend, addend, sum }; pthreadpool_parallelize_1d(threadpool, (pthreadpool_task_1d_t) add_arrays, (void*) &context, ARRAY_SIZE, PTHREADPOOL_FLAG_DISABLE_DENORMALS /* flags */); pthreadpool_destroy(threadpool); threadpool = NULL; printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Augend", augend[0], augend[1], augend[2], augend[3]); printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Addend", addend[0], addend[1], addend[2], addend[3]); printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Sum", sum[0], sum[1], sum[2], sum[3]); return 0; }