linux 通过互斥量实现线程同步
2016-03-28 15:48
411 查看
在计算机中,通常是多线程同时执行,线程均可访问进程的资源,因此当这些线程并发访问临界资源时,如果不进行线程同步,将会导致错误发生,程序运行结果出现不可预知的错误,但往往这些错误无法重现,并且程序正确运行。linux提供了互斥量来控制线程对临界资源的访问,即通过对互斥量进行加锁解锁。
下面程序实现四个数相加。首先在主线程中创建了两个线程分别执行run1,和run2。这两个线程在执行的过程中都会访问临界资源a,b,以及calculate_sum方法,两个线程同时执行。假设,当同时访问a时,线程1将2赋值给了a,线程2在其后又将4赋给了a,那么a的值便改变了,而线程1运行的结果便改变了。
因此,在我们不知道线程运行顺序的时候,通过定义信号量,对要访问的临界资源进行加锁解锁操作。在线程中对a,b,以及calculate_sum方法进行加锁,在访问完后再对其进行解锁操作,便可实现线程同步。
下面程序实现四个数相加。首先在主线程中创建了两个线程分别执行run1,和run2。这两个线程在执行的过程中都会访问临界资源a,b,以及calculate_sum方法,两个线程同时执行。假设,当同时访问a时,线程1将2赋值给了a,线程2在其后又将4赋给了a,那么a的值便改变了,而线程1运行的结果便改变了。
因此,在我们不知道线程运行顺序的时候,通过定义信号量,对要访问的临界资源进行加锁解锁操作。在线程中对a,b,以及calculate_sum方法进行加锁,在访问完后再对其进行解锁操作,便可实现线程同步。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<pthread.h> #include<unistd.h> typedef unsigned int u32; pthread_t ntid1; pthread_t ntid2; void calculate_sum(int a,int b,const char*); void *run1(void *); void *run2(void *); int main(){ int err1,err2; err1 = pthread_create(&ntid1,NULL,run1,NULL); err2 = pthread_create(&ntid2,NULL,run2,NULL); sleep(2); return 0; } int sum = 0; int a = 0; int b = 0; pthread_mutex_t mqlock = PTHREAD_MUTEX_INITIALIZER; void calculate_sum(int a,int b,const char *s){ sum =sum + a + b; printf("%s: sum = %d\n",s,sum); } void *run1(void *arg){ pthread_mutex_lock(&mqlock); a = 2; b = 5; sleep(1); calculate_sum(a,b,"run1"); pthread_mutex_unlock(&mqlock); } void *run2(void *arg){ pthread_mutex_lock(&mqlock); a = 4; b = 4; calculate_sum(a,b,"run2"); pthread_mutex_unlock(&mqlock); }
相关文章推荐
- linux下开启防火墙,打开端口
- Linux多线程同步的几种方式
- vmlinux,vmlinuz,uImage,zImage,bzImage之间的异同
- Linux系统脚本分析之rc.sysinit
- RHEL(Red Hat Enterprise Linux)配置YUM源
- arm-linux交叉编译之lua
- centos6.5上搭建git2.3.0服务器
- linux的物理内存与线性地址空间布局--2
- Linux与Windows共享文件的两种方法
- linux的物理内存与线性地址空间布局--1
- linux内存寻址解析
- Linux内核访问外设I/O资源的方式
- linux使用flock文件锁解决crontab冲突问题
- 文件系统超级块
- linux地址转换
- CentOS7源码编译安装Postgresql9.5
- Linux系统管理之创建用户
- linux top命令详解
- linux应用程序:键盘双击与长按识别及串口通讯
- 从 Linux 内核访问用户空间内存