Futures
Futures allow you to wait for task completion and retrieve results.
Basic Usage
c
#include <fastqueue/fastqueue.h>
#include <stdio.h>
static void compute(void *arg)
{
long *result = (long *)arg;
long sum = 0;
for (long i = 0; i < 1000000; ++i) sum += i;
*result = sum;
}
int main(void)
{
fq_scheduler_t *scheduler = NULL;
fq_scheduler_config_t cfg;
fq_scheduler_config_default(&cfg);
cfg.thread_count = 4;
fq_scheduler_create(&scheduler, &cfg);
long result = 0;
fq_future_t *future = NULL;
fq_task_t *task = NULL;
fq_task_create(&task, compute, &result, NULL);
fq_scheduler_submit_with_future(scheduler, task, &future);
fq_future_wait(future);
printf("Result: %ld\n", result);
fq_future_destroy(future);
fq_scheduler_shutdown(scheduler);
return 0;
}API Reference
Creation
c
fq_status_t fq_future_create(fq_future_t **future, const fq_allocator_t *allocator);
void fq_future_destroy(fq_future_t *future);Waiting
c
fq_status_t fq_future_wait(fq_future_t *future);
fq_status_t fq_future_wait_timeout(fq_future_t *future, unsigned timeout_ms, fq_status_t *status);
fq_bool_t fq_future_is_ready(const fq_future_t *future);Error Handling
c
fq_status_t fq_future_status(const fq_future_t *future);Multiple Futures
c
#include <fastqueue/fastqueue.h>
#include <stdio.h>
static void compute(void *arg)
{
long *result = (long *)arg;
*result = (*result) * (*result);
}
int main(void)
{
fq_scheduler_t *scheduler = NULL;
fq_scheduler_config_t cfg;
fq_scheduler_config_default(&cfg);
cfg.thread_count = 4;
fq_scheduler_create(&scheduler, &cfg);
long results[5] = {1, 2, 3, 4, 5};
fq_future_t *futures[5];
for (int i = 0; i < 5; ++i) {
fq_task_t *task = NULL;
fq_task_create(&task, compute, &results[i], NULL);
fq_scheduler_submit_with_future(scheduler, task, &futures[i]);
}
for (int i = 0; i < 5; ++i) {
fq_future_wait(futures[i]);
printf("Result %d: %ld\n", i, results[i]);
fq_future_destroy(futures[i]);
}
fq_scheduler_shutdown(scheduler);
return 0;
}Timeout
c
fq_future_t *future = NULL;
fq_task_t *task = NULL;
fq_task_create(&task, slow_task, NULL, NULL);
fq_scheduler_submit_with_future(scheduler, task, &future);
fq_status_t st = fq_future_wait_timeout(future, 5000, NULL); // 5 second timeout
if (st == FQ_OK) {
printf("Task completed\n");
} else {
printf("Timeout or error\n");
}
fq_future_destroy(future);