一个简单的互斥量的例子

1。 互斥量
    Linux提供了控制线程执行和访问代码临界区域的方法。其中最基本的两种办法是信号量和互斥量。
关于信号量,笔者在Linux信号量介绍中介绍

    本文只介绍semaphore.h 相关的信号量的简单的操作。关于信号量在笔者其他博客里有详细介绍。

    Linux还有其他共享内存的方法。

2. 与互斥量相关的函数


    #include <pthread.h>

    int pthread_mutex_init(pthread_mutex_t*mutex, pthread_mutexattr_t *mutexattr); //创建互斥量

    int pthread_mutex_lock(pthread_mutex_t*mutex);//加锁

    int pthread_mutex_unlock(pthread_mutex_t*mutex);//解锁

    int pthread_mutex_destroy(pthread_mutex_t*mutex);//清理互斥量

3. 一个简单的程序例子


   
/***************************************
 *    @file            mutex.c
 *    @brief        互斥锁
 *    @author        Windeal
 *    @date        2013/08/06
***************************************/

 
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
 
#define WORK_SIZE 1024
char work_area[WORK_SIZE];
 
pthread_mutex_t work_mutex;
 
int time_to_exit = 0;
 
void *thread_function(void *arg);
 
int main(int argc,char* argv[])
{
    int ret;
    pthread_t a_thread;
    void *thread_result;
 
    ret = pthread_mutex_init(&work_mutex, NULL);
    if (ret != 0) {
        perror("pthread_mutex_init failed ");
        exit(EXIT_FAILURE);
    }
 
 
 
    printf("It time to create a thread! ");   /////////////////////
    ret = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (ret != 0) {
        perror("Thread creation failed! ");
        exit(EXIT_FAILURE);
    }
 
    pthread_mutex_lock(&work_mutex);    //加锁
    printf("Input some text. Enter "end" to finished ");
    while (!time_to_exit) {        //
        fgets(work_area, WORK_SIZE, stdin);
        pthread_mutex_unlock(&work_mutex); // 解锁
        while (1) {
            pthread_mutex_lock(&work_mutex);    //加锁
            if (work_area[0]!= ''){        //如果有数据则到解锁,没有数据则继续输入
                pthread_mutex_unlock(&work_mutex);// 解锁 因为workarea里有数据
                                    //因此到另一个线程里比对
                sleep(1);
            }
            else {
                break;
            }
        }
    }
 
    pthread_mutex_unlock(&work_mutex); // 解锁
    printf("Waiting for thread finish! "); /////////////////
    ret = pthread_join(a_thread, &thread_result);
    if (ret != 0) {
        perror("Thread finished failed ");
        exit(EXIT_FAILURE);
    }
 
    printf("Thread joined ");
    pthread_mutex_destroy(&work_mutex);
    exit(EXIT_SUCCESS);
 
}
 
void *thread_function(void * arg) {
    sleep(1);
    pthread_mutex_lock(&work_mutex);
    while (strncmp("end", work_area,3) != 0) {
        printf("You have enter %d charactor ", strlen(work_area)-1);
        work_area[0] = '';    //清零数据区
        pthread_mutex_unlock(&work_mutex);     //让主线程继续输入数据
        sleep(1);
        pthread_mutex_lock(&work_mutex);  //尝试加锁,如果主线程已输入数据,则加锁成功
        while (work_area[0]== '') {    //如果输入为空,则继续等待输入.输入不为空时,跳出循环
            pthread_mutex_unlock(&work_mutex);
            sleep(1);
            pthread_mutex_lock(&work_mutex);
        }
    }
 
    time_to_exit = 1;
    work_area[0] ='';
    pthread_mutex_unlock(&work_mutex);
    pthread_exit(0);
 
}
 

结果如下所示:

 

 

 

 

 

 

 

 

 

 

 

 

    

原文地址:https://www.cnblogs.com/Windeal/p/4284677.html