Using the threadmutex class

The threadmutex class provides mutual exclusion locks between separate threads of a single process.

Intances of threadmutex can be used to protect critical sections of code or synchronize threads.

In this example, five threads are spawned. Each counts from 0 to 4, ten times. A threadmutex is used to synchronize the threads so that each thread is able to finish its count without being interrupted by another thread.

#include <rudiments/thread.h>
#include <rudiments/threadmutex.h>
#include <rudiments/stdio.h>

// struct for passing arguments into the thread
struct args {
        thread          *th;
        threadmutex     *tm;
        int32_t         id;
};

// function that will be spawned as a thread
void count(void *args) {

        struct args     *a=(struct args *)args;

        // lock the mutex
        a->tm->lock();

        // count to 5, ten times
        stdoutput.printf("thread %d: ",a->id);
        for (uint16_t oc=0; oc<10; oc++) {
                for (uint16_t ic=0; ic<5; ic++) {
                        stdoutput.printf("%d",ic);
                }
        }
        stdoutput.printf("\n");

        // unlock the mutex
        a->tm->unlock();

        // exit
        a->th->exit(&(a->id));
}

int main(int argc, const char **argv) {

        // create 5 threads
        thread          t[5];

        // create a mutex to synchronize them
        threadmutex     tm;

        // initialize threads
        struct args     a[5];
        for (uint16_t i=0; i<5; i++) {
                a[i].th=&t[i];
                a[i].tm=&tm;
                a[i].id=i;
        }

        // lock the mutex
        tm.lock();

        // spawn threads (each will block on the mutex)
        for (uint16_t j=0; j<5; j++) {
                if (!t[j].spawn((void*(*)(void*))count,(void *)&a[j],false)) {
                        stdoutput.printf(%d: spawn failed\n",j);
                }
        }

        // unlock the mutex (allows the threads to proceed)
        tm.unlock();

        // wait for the threads to exit
        for (uint16_t k=0; k<5; k++) {
                int32_t tstatus=-1;
                t[k].wait(&tstatus);
                stdoutput.printf("thread %d status: %d\n",k,tstatus);
        }
}