Linux互斥锁的使用

来源:互联网 发布:北京大学网络教育官网 编辑:程序博客网 时间:2024/06/06 17:18

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

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

#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 : 0output : 0output : 1output : 1output : 2output : 2output : 3output : 3output : 4output : 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<15;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 : 0output : 1output : 2output : 3output : 4output : 0output : 1output : 2output : 3output : 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.。。。。。

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