Using mutex and pthreads condition variables

The problem that I want to find is written in paragraph No. 7. Prior to this, I describe the structure of my code.

  • From main()created and initialized two streams thread1 and thread2 with two functions fun1()and fun2(), respectively.
  • I have named mutex lock_mutexand condition variables named cond1, cond2, cond3andcond4.
  • I have a global logical variables var1, var2, var3and var4all initialized to false.
  • fun1() as follows:

    void fun1(){
    while(1){
    pthread_mutex_lock(&lock_mutex);
    while(var1 is false)
        pthread_cond_wait(&cond1,&lock_mutex);
    //do some work
    set var3 = true;
    pthread_cond_signal(&cond3);
    set var1=false;
    pthread_mutex_unlock(&lock_mutex);
    }
    }
    
  • fun2() as follows:

    void fun2(){
    while(1){
    pthread_mutex_lock(&lock_mutex);
    while(var2 is false)
        pthread_cond_wait(&cond2,&lock_mutex);
    //do some work
    set var4 = true;
    pthread_cond_signal(&cond4);
    set var2=false;
    pthread_mutex_unlock(&lock_mutex);
    }
    }
    
  • In my code there are functions that contain lock_mutex, perform some work and signals cond1and cond2, if necessary, for example (each of them is a separate function):

function A:

    pthread_mutex_lock(&lock_mutex);
    //do some work
    set var1= true;
    pthread_cond_signal(&cond1);
    pthread_mutex_unlock(&lock_mutex);

function B:

pthread_mutex_lock(&lock_mutex);
//do some work
set var2= true;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&lock_mutex);

C:

pthread_mutex_lock(&lock_mutex)
//do some work
while(var3 is false)
pthread_cond_wait(&cond3,&lock_mutex);
//do more work
set var3=false;
pthread_mutex_unlock(&lock_mutex);

D:

pthread_mutex_lock(&lock_mutex)
//do some work
while(var4 is false)
pthread_cond_wait(&cond4,&lock_mutex);
//do more work
set var4= false;
pthread_mutex_unlock(&lock_mutex);

7. fun1() fun2() A B. , fun1() fun2() C D , .

fun1() fun2() . while, , .

. - / , .

.

+3
3

.

, , , ?

0

- , pthread_cond_wait .

+1

, , , , , .

, , :

  • function B cond2.
  • fun2 , var4 true, cond4, var2 false, .
  • fun2 , , cond2 var2 .
  • function B , var2 true, cond2
  • fun2 , var4 true, cond4, var2 false, .
  • cond4 .
0
source

Source: https://habr.com/ru/post/1750758/


All Articles