#define _POSIX_C_SOURCE 200809L
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct work { int input; int result; };
static void *square(void *argument) {
    struct work *job = argument;
    job->result = job->input * job->input;
    return NULL;
}
int main(void) {
    struct work job = { .input = 7, .result = 0 };
    pthread_t worker;
    int error = pthread_create(&worker, NULL, square, &job);
    if (error != 0) {
        fprintf(stderr, "pthread_create: %s\n", strerror(error));
        return EXIT_FAILURE;
    }
    /* Do not read job.result until the worker has completed. */
    error = pthread_join(worker, NULL);
    if (error != 0) {
        fprintf(stderr, "pthread_join: %s\n", strerror(error));
        return EXIT_FAILURE;
    }
    printf("result = %d\n", job.result);
    return job.result == 49 ? EXIT_SUCCESS : EXIT_FAILURE;
}
