Linux互斥锁的使用

直接上示例代码,个人感觉这样学习更快。

示例代码一:不使用互斥锁,直接创建多线程,运行函数。前提是懂得线程创建函数的用法。

 

#include <pthread.h>  
#include <stdio.h>  
  
pthread_mutex_t mutex ;  
void *print_msg(void *arg){  
        int i=0;  
    //    pthread_mutex_lock(&mutex);  
        for(i=0;i<5;i++){  
                printf("output : %d\n",i);  
                usleep(100);  
        }  
 //       pthread_mutex_unlock(&mutex);  
}  
int main(int argc,char** argv){  
        pthread_t id1;  
        pthread_t id2;  
        pthread_mutex_init(&mutex,NULL);  
        pthread_create(&id1,NULL,print_msg,NULL);  
        pthread_create(&id2,NULL,print_msg,NULL);  
        pthread_join(id1,NULL);  
        pthread_join(id2,NULL);  
        pthread_mutex_destroy(&mutex);  
        return 1;  
} 

运行结果如下:

output : 0
output : 0
output : 1
output : 1
output : 2
output : 2
output : 3
output : 3
output : 4
output : 4

 

如果把关于锁的注释取消,使用如下代码:

 

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

   pthread_mutex_t mutex ;
    void *print_msg(void *arg){
            int i=0;
           pthread_mutex_lock(&mutex);
            for(i=0;i<5;i++){
                    printf("output : %d\n",i);
                    usleep(100);
            }
           pthread_mutex_unlock(&mutex);
    }
    int main(int argc,char** argv){
            pthread_t id1;
            pthread_t id2;
            pthread_mutex_init(&mutex,NULL);
            pthread_create(&id1,NULL,print_msg,NULL);
            pthread_create(&id2,NULL,print_msg,NULL);
            pthread_join(id1,NULL);
            pthread_join(id2,NULL);
            pthread_mutex_destroy(&mutex);
            return 1;
    }

运行结果如下:

 

 

output : 0
output : 1
output : 2
output : 3
output : 4
output : 0
output : 1
output : 2
output : 3
output : 4

对比可以知道互斥锁的主要作用是,只保证一个线程执行,当锁摧毁之后,才可以由第二个线程执行。

第二天,又看到了一些关于互斥锁使用的代码,放到这里分享给大家,同样编译的时候 注意使用-lpthread

 

/*
此代码测试互斥锁的使用,0-100分成两段分别计算。
*/
#include<stdlib.h>  
#include<stdio.h>  
#include<unistd.h>  
#include<pthread.h>  
typedef struct ct_sum  
{   int sum;  
    pthread_mutex_t lock;  
}ct_sum;  
void * add1(void * cnt)  
{       
     
    pthread_mutex_lock(&(((ct_sum*)cnt)->lock));  
    int i;  
        for( i=0;i<50;i++){  
            (*(ct_sum*)cnt).sum+=i;}  
    pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));  
    pthread_exit(NULL);  
    return 0;  
}  
void * add2(void *cnt)  
{       
    int i;  
    cnt= (ct_sum*)cnt;  
    pthread_mutex_lock(&(((ct_sum*)cnt)->lock));  
    for( i=50;i<101;i++)  
    {    (*(ct_sum*)cnt).sum+=i;         
    }  
    pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));  
    pthread_exit(NULL);  
    return 0;  
}  
int main(void)  
{   int i;  
    pthread_t ptid1,ptid2;  
    int sum=0;  
    ct_sum cnt;  
    pthread_mutex_init(&(cnt.lock),NULL);  
    cnt.sum=0;  
    pthread_create(&ptid1,NULL,add1,&cnt);  
    pthread_create(&ptid2,NULL,add2,&cnt);  
  
//    pthread_mutex_lock(&(cnt.lock));  代码原作者有这两句,但是我认为米有必须就注释掉了
//    pthread_mutex_unlock(&(cnt.lock));  
    pthread_join(ptid1,NULL);  
    pthread_join(ptid2,NULL);  
    pthread_mutex_destroy(&(cnt.lock));  
    printf("sum %d\n",cnt.sum);  
    return 0;  
} 

这样运行之后的结果就是  sum 5050;

 

稍作更改之后,我取消函数中的互斥锁,希望可以得到错误的sum值,但是不知道为什么却没有想要的效果,仍然是正确的5050,我怀疑是我加互斥锁的位置不正确。具体代码如下:

 

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
typedef struct ct_sum
{   int sum;  
    pthread_mutex_t lock;
}ct_sum;
void * add1(void * cnt)
{

//    pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
    int i;
        for( i=0;i<50;i++){
            (*(ct_sum*)cnt).sum+=i;}
//    pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
    pthread_exit(NULL);
    return 0;
}
void * add2(void *cnt)
{
    int i;
    cnt= (ct_sum*)cnt;
//    pthread_mutex_lock(&(((ct_sum*)cnt)->lock));
    for( i=50;i<101;i++)
    {    (*(ct_sum*)cnt).sum+=i;
    }
//    pthread_mutex_unlock(&(((ct_sum*)cnt)->lock));
    pthread_exit(NULL);
    return 0;
}
int main(void)
{   int i;
    pthread_t ptid1,ptid2;
    int sum=0;
    ct_sum cnt;
//    pthread_mutex_init(&(cnt.lock),NULL);
    cnt.sum=0;
    pthread_create(&ptid2,NULL,add2,&cnt);
    pthread_create(&ptid1,NULL,add1,&cnt);

//    pthread_mutex_lock(&(cnt.lock));
//    pthread_mutex_unlock(&(cnt.lock));
    pthread_join(ptid1,NULL);
    pthread_join(ptid2,NULL);
    pthread_mutex_destroy(&(cnt.lock));
    printf("sum %d\n",cnt.sum);
    return 0;
}


运行结果之后,仍然为 5050.。。。。。

 

希望对这方面有了解的朋友,给我留言,指点迷津。

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值