Applying C - Condition Variables
Monday, 12 November 2018
Article Index
Applying C - Condition Variables
First Thread

In the main program we need to declare the mutex, condition variable and the global variable:

pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t myConVar = PTHREAD_COND_INITIALIZER;
int threadid=0;

The main program starts the two threads going and then waits:

int main(int argc, char** argv) {
    srand(time(0));
    pthread_t pthreadA;
    pthread_create(&pthreadA, NULL, threadA, NULL);
    pthread_t pthreadB;
    pthread_create(&pthreadB, NULL, threadB, NULL);
    pthread_mutex_lock(&my_mutex);
    while (threadid == 0) 
pthread_cond_wait(&myConVar, &my_mutex); printf("%d", threadid); pthread_mutex_unlock(&my_mutex); return (EXIT_SUCCESS); }

Notice that the call to pthread_cond_wait is in the form of a while loop. The reason is that the wait can end without any thread signaling. To make sure that it isn’t a spurious wake-up we have to check that threadid has been set to something other than zero. If it is still zero then the wait is restarted. Finally we print the value of threadid and unlock the mutex. Notice you can’t unlock the mutex until the value of threadid has been printed as one of the other threads might update it.

The complete program is:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t myConVar = PTHREAD_COND_INITIALIZER;
int threadid = 0;
void * threadA(void *p) {
    sleep(rand() % 5);
    pthread_mutex_lock(&my_mutex);
    threadid = 1;
    pthread_cond_signal(&myConVar);
    pthread_mutex_unlock(&my_mutex);
}
void * threadB(void *p) {
    sleep(rand() % 5);
    pthread_mutex_lock(&my_mutex);
    threadid = 2;
    pthread_cond_signal(&myConVar);
    pthread_mutex_unlock(&my_mutex);
}
int main(int argc, char** argv) {
    srand(time(0));
    pthread_t pthreadA;
    pthread_create(&pthreadA, NULL, threadA, NULL);
    pthread_t pthreadB;
    pthread_create(&pthreadB, NULL, threadB, NULL);
    pthread_mutex_lock(&my_mutex);
    while (threadid == 0)
pthread_cond_wait(&myConVar, &my_mutex); printf("%d", threadid); pthread_mutex_unlock(&my_mutex); return (EXIT_SUCCESS); }

Now that you have seen how this works you should be able to modify the program so that the main program only resumes when all of the threads have completed.

All you have to do is change the update of the global variable and the signal to:

threadid++;
if(threadid==2) pthread_cond_signal(&myConVar);

With this change each thread increments the global variable but only wakes the main thread up when it reaches 2 and both threads have terminated.

You might want to use this in place of joins if you want to create detached threads.

Now available as a paperback or ebook from Amazon.

Applying C For The IoT With Linux

  1. C,IoT, POSIX & LINUX
  2. Kernel Mode, User Mode & Syscall
  3. Execution, Permissions & Systemd
    Extract Running Programs With Systemd
  4. Signals & Exceptions
    Extract  Signals
  5. Integer Arithmetic
  6. Fixed Point
    Extract Simple Fixed Point Arithmetic ***NEW
  7. Floating Point
  8. File Descriptors
  9. The Pseudo-File System
    Extract: The Pseudo File System 
  10. Graphics
    Extract: framebuffer 
  11. Sockets
  12. Threading
    Extract  Condition Variables
    Extract  Deadline Scheduling
  13. Cores Atomics & Memory Management
  14. Interupts & Polling
  15. Assembler
    Extract: Assembler 

Also see the companion book: Fundamental C

<ASIN:1871962609>

<ASIN:1871962463>

<ASIN:1871962617>

<ASIN:1871962455>

Related Articles

Remote C/C++ Development With NetBeans

Raspberry Pi And The IoT In C

Getting Started With C/C++ On The Micro:bit

To be informed about new articles on I Programmer, sign up for our weekly newsletter, subscribe to the RSS feed and follow us on, Twitter, Facebook or Linkedin.

Banner


React Power BI Released
28/07/2020

Microsoft has released a Power BI component for React that supports both JavaScript and TypeScript and can be used to embed analytics in a React web application.



Too Good To Miss: E.coli Could Be Your Next Raspberry Pi
02/08/2020

Some of our articles deserve a second outing. Here we have one such from last October to add to our occasional Too Good to Miss series. It's all about E.coli and programming. No, it's not a story abou [ ... ]


More News

graphics

 



 

Comments




or email your comment to: comments@i-programmer.info



Last Updated ( Sunday, 09 June 2019 )