线程之间的同步与互斥

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/79084781

一 互斥锁

  互斥锁机制主要包括以下基本函数

  互斥锁初始化  pthread_mutex_init()

  互斥锁上锁  pthread_mutex_lock()

  互斥锁判断上锁  pthread_mutex_trylock()

  互斥锁解锁 pthread_mutex_unlock()

  删除互斥锁  pthread_mutex_destory()

二 实例

  在thread.c的基础上加入互斥锁,实现原本独立与无序的多个线程按照顺序执行

/*在thread.c的基础上加入互斥锁功能,*/
//多线程是并发执行,没有固定的顺序
#include <stdio.h>  
#include <pthread.h>  
#include <stdlib.h>

#define THREAD_NUMBER 3 /*线程数*/
#define REPEAT_NUMBER 5 /*每个线程中的小任务数*/
#define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/

pthread_mutex_t mutex;  

void *thrd_func(void *arg)
{
    //线程函数例程
    int thrd_num=(int)arg;
    int delay_time=2;
    int count=0;
    int res;
    
    //互斥锁上锁
    /*********************
    函数原型: int pthread_mutex_lock(pthread_mutex_t *mutex)
    函数参数: mutex  互斥锁
    返回值: 成功 0
             失败 -1
    
    *********************/
    res=pthread_mutex_lock(&mutex);
    if(res)
    {
        printf("thread %d lock filed\n",thrd_num);	
        pthread_exit(NULL);    	
    }
    
    
    printf("thread %d is starting\n",thrd_num);
    
    for(count=0;count<REPEAT_NUMBER;count++)
    {
    	/*RAND_MAX 是 <stdlib.h> 中伪随机数生成函数 rand 所能返回的最大数值*/
        //delay_time=(int)(rand()* DELAY_TIME_LEVELS/(RAND_MAX))+1;
        
        sleep(delay_time);
        
        printf("thread %d: job %d,delay=%d\n",thrd_num,count,delay_time);	
    	   	
    }	
    
    printf("Thread %d finished\n",thrd_num);
    pthread_mutex_unlock(&mutex);
    /*******************
    函数原型:void pthread_exit(void *retval)
    函数参数: retval线程结束时的返回值,可由其他函数如pthread_join()获取
    ******************/
    pthread_exit(NULL);	
}


int main()
{
    pthread_t thread[THREAD_NUMBER];
    int no=0,res;
    void *thrd_ret;
    
    srand(time(NULL));
    
    //初始化互斥锁
    /******************************
    函数原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                           const pthread_mutexattr_t *restrict attr);
    函数参数: mutex 互斥锁
               attr  PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁
                     PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁
                     PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 创建检错互斥锁
    函数返回值: 成功 0
                 失败 返回错误码
    ***************************/
    pthread_mutex_init(&mutex,NULL);
    
    for(no=0;no<THREAD_NUMBER;no++)
    {
    	/*创建多线程*/

    	res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);
    	
     	if(res!=0)
     	{
            //创建线程失败
     	    printf("thread %d join failed\n",no);
     	    exit(res);
     	}
    	
    }
    
    printf("creat threads success\n waiting for threads to finish...\n");
    
    for(no=0;no<THREAD_NUMBER;no++)
    {
        //等待线程结束
        res=pthread_join(thread[no],&thrd_ret);	
    	if(!res)
    	{
    	    printf("thread %d joined\n",no);	
    	}
    	else
    	{
    	    printf("thread %d joined fail\n",no);	    		
    	}
    	//互斥锁解锁
    	/*********************
    	函数原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
    	函数参数:mutex 互斥锁
    	返回值: 成功 0
    	**********************/
    	//pthread_mutex_unlock(&mutex);   	
    }
    
    //消除互斥锁
    pthread_mutex_destroy(&mutex);
    return 0;		
}
运行结果



猜你喜欢

转载自blog.csdn.net/qq_27312943/article/details/79084781