【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量


        Pthread 是 POSIX threads 的简称,是POSIX的 线程标准
         Pthread线程同步多个线程协调地,有序地同步使用共享资源【C/C++多线程编程之五】pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误。协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点。
       互斥量,是最简单的线程同步机制,也是最常用的同步策略。
       
       1.互斥量mutex

       互斥量是一种线程同步对象,“互斥”的含义是同一时刻只能有一个线程获得互斥量。一个互斥量对应一个共享资源,互斥量状态:1.解锁状态意味着共享资源可用,2.加锁状态意味着共享资源不可用
       一个线程需要使用共享资源时,使用thread_mutex_lock申请:1.当互斥量为解锁状态,则占用互斥量,并给互斥量加锁,占用资源(互相量为加锁状态,其他线程不能使用互斥量并等待互斥量变为解锁状态),2.如果互斥量为加锁状态,则线程等待,直到互斥量为解锁状态(其他线程使用完共享资源后会解锁互斥量,释放资源)。

        2.互斥量基本函数         
        #include <pthread.h>
初始化互斥量:
        int pthread_mutex_init(pthread_mutex *mutex,
                                                const pthread_mutexattr_t* mutexattr
);
        该函数第一个参数为一个互斥量指针,第二个参数为互斥量属性指针(一般设为NULL)。该函数将按照互斥量属性对互斥量进行初始化。
互斥量加锁:
        int pthread_mutex_lock(pthread_mutex *mutex);
        该函数申请一个互斥量并对其进行加锁,使该互斥量对其他线程不可用,让其他申请互斥量的线程等待。
互斥量解锁:
        int pthread_mutex_unlock(pthread_mutex *mutex);
        该函数对互斥量进行解锁操作,使该互斥量对其他线程可以。
销毁互斥量:
        int pthread_mutex_destroy(pthread_mutex *mutex);
        该函数销毁一个不再需要的互斥量,释放系统资源。
          
             3.牛刀小试
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#pragma comment(lib, "pthreadVC2.lib")     //必须加上这句
pthread_t t1;           //pthread_t变量t1,用于获取线程1的ID
pthread_t t2;           //pthread_t变量t2,用于获取线程2的ID
char Share[10];         //共享资源区
pthread_mutex_t work_mutex;                    //声明互斥量work_mutex
void* My_thread_1(void* args){
	while(1){
	   char *p=Share;
	   //pthread_mutex_lock(&work_mutex);      //加锁
	   for(int i=0;i<9;i++)
	   {
	       *p='a';             //线程1将Share写成aaaaaaaa
		   Sleep(100);
		   p++;
	   }
	   p++;
	   *p='\0';
	   printf("1 Share is : %s\n",Share);
	   //pthread_mutex_unlock(&work_mutex);   //解锁
	   //Sleep(100)            //启用互斥量时也去除注释,为进程调度提供时间
	   }
	   return NULL;
}
void* My_thread_2(void* args){
	while(1){
	   char *p=Share;
	   //pthread_mutex_lock(&work_mutex);     //加锁
	   for(int i=0;i<9;i++)
	   {
	       *p='e';             //线程1将Share写成eeeeeeee
		   Sleep(150);
		   p++;
	   }
	   p++;
	   *p='\0';
	   printf("2 Share is : %s\n",Share);
	   //pthread_mutex_unlock(&work_mutex);   //解锁
	   //Sleep(100)            //启用互斥量时也去除注释,为进程调度提供时间
	   }
	   return NULL;
}
int main(){
	   //pthread_mutex_init(&work_mutex, NULL);   //初始化互斥量
       pthread_create(&t1,NULL,My_thread_1,NULL);
	   pthread_create(&t2,NULL,My_thread_2,NULL);
       Sleep(1000000);
	   //pthread_mutex_destroy(&work_mutex);      //销毁互斥量
       return 0;
}

       
       
      
      
     
     
    
    
              线程My_thread_1将共享资源字符串Share写成aaaaaaaa,线程My_thread_2则将其写成eeeeeeee。
       不启用互斥量的情况下,两个线程对共享资源的访问是随机并且无规律,相互干扰打断,产生a和e混合的字符串,这显然不是我们期望的结果。
       启用互斥量(去掉注释)情况下,互斥量机制其作用,两个线程同步协调地访问共享资源Share,产生aaaaaaaa或eeeeeeee字符串,符合我们的预期。 
         通过该示例,读者可以直观地感受到互斥量的作用,亲身体会互斥量机制,同时能让读者了解互斥量的内在原理。

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值