一个简单例子了解使用互斥量线程同步

 在刚开始学习学习线程同步时总是认为两个线程或是多个线程共同运行,但是那样是做的。

   同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。 “同”字从字面上容易理解为一起动作。 其实不是,“同”字应是指协同、协助、互相配合。 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。



接下来用一个简单的例子演示通过互斥量进行的线程的同步,演示的思想为一个线程对数据操作,另一个数据输出结果。



代码如下:


#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <pthread.h>
#include <errno.h>  


pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//定义互斥变量并初始化 
int lock_var; 
time_t end_time;  
void pthread1(void *arg); 
void pthread2(void *arg);  
int main(int argc, char *argv[])
{       
pthread_t id1,id2;
pthread_t mon_th_id;
int ret;  


end_time = time(NULL)+10; 
/*互斥锁初始化*/       
pthread_mutex_init(&mutex,NULL);
/*创建两个线程*/       
ret=pthread_create(&id1,NULL,(void *)pthread1, NULL);
if(ret!=0)               
perror("pthread cread1"); 
ret=pthread_create(&id2,NULL,(void *)pthread2, NULL);  
if(ret!=0)              
perror("pthread cread2"); 


pthread_join(id1,NULL); 
pthread_join(id2,NULL);  
exit(0);
}  
void pthread1(void *arg) 
{       
int i;      
while(time(NULL) < end_time)
{ /*互斥锁上锁*/           
if(pthread_mutex_lock(&mutex)!=0)
{          
perror("pthread_mutex_lock");           
}           
else                   
printf("pthread1:pthread1 lock the variable\n");          
for(i=0;i<2;i++)
{                  
sleep(1);                  
lock_var++;       

/*互斥锁接锁*/           
if(pthread_mutex_unlock(&mutex)!=0)
{                  
perror("pthread_mutex_unlock");           
}           
else                  
printf("pthread1:pthread1 unlock the variable\n");       
sleep(1);       

}  
void pthread2(void *arg) 
{       
int nolock=0;       
int ret;       
while(time(NULL) < end_time)
{ /*测试互斥锁*/           
ret=pthread_mutex_trylock(&mutex);           
if(ret==EBUSY)                  
printf("pthread2:the variable is locked by pthread1\n");
else





if(ret!=0)
{                           
perror("pthread_mutex_trylock");                           
exit(1);                  
}                  
else                           
printf("pthread2:pthread2 got lock.The variable is %d\n",lock_var); /*互斥锁接锁*/                  
if(pthread_mutex_unlock(&mutex)!=0)
{                         
perror("pthread_mutex_unlock");                  
}                  
else                         
printf("pthread2:pthread2 unlock the variable\n");           
}           
sleep(3); 
printf("++++++++++++++++++++++\n");      


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值