2018-07-31-使用mutex互斥量和条件变量对线程进行同步的例子

两个线程之前使用互斥量和条件变量进行同步。C代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

/* 互斥量 */
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;
/* 条件变量 */
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;

/* 临界资源,两个线程都会访问 */
int value = 0;

void * thread2(void *arg)
{
    while (1)
    {
        pthread_mutex_lock(&qlock);

        while(!value)
        {
            /* 我理解:thread2在这里等的时候,会对互斥qlock进行解锁。被
             * thread1的signal唤醒后,它又会把互斥量qlock锁住 */
            pthread_cond_wait(&qready, &qlock);
        } 

        printf("in thread 2: value = %d\n", value);
        
        value = 0;
        
        sleep(1);

        pthread_mutex_unlock(&qlock);
    }

    return NULL;
}

int main(int argc, char *argv[])
{
    printf("Test for mutex and conf: \n");
    
    pthread_t tid;
    int i = 1;

    while(1)
    {
        pthread_create(&tid, NULL, &thread2, NULL);

        /* thread2被唤醒正在进行处理,时,如果正在访问临界资源,这里就
         * 是value。那该线程会在这里等待。 */
        pthread_mutex_lock(&qlock);
        
        value = i;

        pthread_mutex_unlock(&qlock);

        printf("[%s:%d] main thread send signal %d\n", __FUNCTION__, __LINE__, value);

        /* 这里就是通过条件变量把thread2唤醒 */
        pthread_cond_signal(&qready);
        
        if (i == 2)
        {
            break;
        }
        
        i++;
    }

    sleep(5);

    return 0;
}

Makefile如下:

.PHONY:a.out
a.out:
        cc main.c -lpthread
clean:
        rm -rfv *~ a.out

Author: Peng Xie

Created: 2018-10-01 Mon 21:36