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); } }