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.。。。。。
希望对这方面有了解的朋友,给我留言,指点迷津。
阅读全文
0 0
- Linux互斥锁的使用
- linux互斥锁pthread_mutex_t 的使用
- Linux 互斥锁 pthread_mutex_t 的使用
- Linux 下 互斥锁的使用
- Linux互斥锁的使用代码实现
- Linux 线程与互斥锁的使用
- Linux互斥锁的使用代码实现
- linux程序多线程互斥锁的简单使用
- linux多线程互斥锁的简单使用
- linux 多线程信号量和互斥锁的使用
- linux的使用
- Linux常用命令的使用
- Linux的使用笔记
- linux Sudo的使用
- Linux Vi的使用
- linux磁带机的使用
- linux vi的使用
- linux定时器的使用
- 解决:MySQL Load Data数据丢失问题
- 算法系列——String to Integer (atoi)
- Java基本数据类型占用字节和范围
- 从涂鸦到发布 —— 理解API的设计过程
- SLAM入门资料汇总
- Linux互斥锁的使用
- oracle组函数和分组概要记录
- Statement和PreparedStatement之间的区别
- MATLAB命令
- Jsp与Servlet的关系以及Jsp与Html的区别
- 算法系列——Path Sum
- Android样式开发——Shape
- 阿里面经最新
- Linux发展史