Skip to content

Parallel For Example

Process array elements in parallel across multiple threads.

C Version

c
#include <fastqueue/fastqueue.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *data;
    int start;
    int end;
} range_t;

static void square_range(void *arg)
{
    range_t *r = (range_t *)arg;
    for (int i = r->start; i < r->end; ++i) {
        r->data[i] = r->data[i] * r->data[i];
    }
}

int main(void)
{
    const int N = 1000000;
    const int THREADS = 4;
    int *data = malloc(N * sizeof(int));

    for (int i = 0; i < N; ++i) data[i] = i;

    fq_thread_pool_t *pool = NULL;
    fq_thread_pool_create_ex(&pool, THREADS);

    int chunk = N / THREADS;
    range_t ranges[THREADS];

    for (int i = 0; i < THREADS; ++i) {
        ranges[i].data  = data;
        ranges[i].start = i * chunk;
        ranges[i].end   = (i == THREADS - 1) ? N : (i + 1) * chunk;
        fq_thread_pool_submit_fn(pool, square_range, &ranges[i]);
    }

    fq_thread_pool_wait_idle(pool);

    printf("data[0]=%d data[999]=%d data[999999]=%d\n",
           data[0], data[999], data[999999]);

    fq_thread_pool_shutdown(pool);
    free(data);
    return 0;
}

C++ Version

cpp
#include <fastqueue/fastqueue.h>
#include <cstdio>
#include <vector>
#include <thread>

int main()
{
    const int N = 1000000;
    const int THREADS = 4;
    std::vector<int> data(N);
    for (int i = 0; i < N; ++i) data[i] = i;

    fq_thread_pool_t *pool = nullptr;
    fq_thread_pool_create_ex(&pool, THREADS);

    int chunk = N / THREADS;

    auto square_range = [&data](void *arg) {
        auto *range = static_cast<std::pair<int, int> *>(arg);
        for (int i = range->first; i < range->second; ++i) {
            data[i] = data[i] * data[i];
        }
    };

    std::vector<std::pair<int, int>> ranges(THREADS);
    for (int i = 0; i < THREADS; ++i) {
        ranges[i] = {i * chunk, (i == THREADS - 1) ? N : (i + 1) * chunk};
        fq_thread_pool_submit_fn(pool, square_range, &ranges[i]);
    }

    fq_thread_pool_wait_idle(pool);

    std::printf("data[0]=%d data[999]=%d data[999999]=%d\n",
                data[0], data[999], data[999999]);

    fq_thread_pool_shutdown(pool);
    return 0;
}

Expected Output

data[0]=0 data[999]=998001 data[999999]=999998000001

Released under the MIT License.