zoukankan      html  css  js  c++  java
  • 一个简单的互斥量的例子

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

    结果如下所示:

     

     

     

     

     

     

     

     

     

     

     

     

        

  • 相关阅读:
    Eclipse中配置约束
    c++ 虚函数
    cocos3 menu
    cocos3 封装一个ball
    cocos3 内存管理机制
    cocos3 多文件拆分cocos
    cocos3 labelttf
    cocos3 messagebox
    cocos3 log
    cocos3 director sprite scene之间的关系
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284677.html
Copyright © 2011-2022 走看看