Skip to content

Graceful Shutdown Example

Properly shut down a scheduler after all tasks complete.

C Version

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

static fq_scheduler_t *g_scheduler = NULL;

static void signal_handler(int sig)
{
    (void)sig;
    printf("\nCaught signal, shutting down...\n");
    if (g_scheduler) {
        fq_scheduler_cancel_all(g_scheduler);
    }
}

static void long_task(void *arg)
{
    int id = *(int *)arg;
    printf("Task %d started\n", id);
    // Simulate work
    for (volatile int i = 0; i < 1000000; ++i) {}
    printf("Task %d completed\n", id);
}

int main(void)
{
    signal(SIGINT, signal_handler);

    fq_scheduler_config_t cfg;
    fq_scheduler_config_default(&cfg);
    cfg.thread_count = 4;

    fq_scheduler_create(&g_scheduler, &cfg);

    for (int i = 0; i < 20; ++i) {
        int *id = malloc(sizeof(int));
        *id = i;
        fq_scheduler_submit_fn(g_scheduler, long_task, id);
    }

    printf("Waiting for tasks to complete...\n");
    fq_scheduler_wait_idle(g_scheduler);

    fq_scheduler_stats_t stats;
    fq_scheduler_stats(g_scheduler, &stats);
    printf("Completed: %d tasks\n", stats.tasks_completed);

    fq_scheduler_shutdown(g_scheduler);
    g_scheduler = NULL;

    printf("Shutdown complete.\n");
    return 0;
}

C++ Version

cpp
#include <fastqueue/fastqueue.h>
#include <cstdio>
#include <cstdlib>
#include <atomic>
#include <csignal>

static fq_scheduler_t *g_scheduler = nullptr;
static std::atomic<bool> g_running{true};

static void signal_handler(int) {
    g_running = false;
    if (g_scheduler) fq_scheduler_cancel_all(g_scheduler);
}

int main()
{
    std::signal(SIGINT, signal_handler);

    fq_scheduler_config_t cfg;
    fq_scheduler_config_default(&cfg);
    cfg.thread_count = 4;
    fq_scheduler_create(&g_scheduler, &cfg);

    for (int i = 0; i < 20; ++i) {
        int *id = new int(i);
        fq_scheduler_submit_fn(g_scheduler, [](void *arg) {
            int id = *static_cast<int *>(arg);
            std::printf("Task %d\n", id);
            for (volatile int j = 0; j < 1000000; ++j) {}
        }, id);
    }

    fq_scheduler_wait_idle(g_scheduler);

    fq_scheduler_stats_t stats;
    fq_scheduler_stats(g_scheduler, &stats);
    std::printf("Completed: %d tasks\n", stats.tasks_completed);

    fq_scheduler_shutdown(g_scheduler);
    g_scheduler = nullptr;
    return 0;
}

Build and Run

bash
gcc -std=c23 -o graceful_shutdown graceful_shutdown.c -lfastqueue -lpthread
./graceful_shutdown

# Press Ctrl+C to test signal handling

Released under the MIT License.