linux系统编程:线程同步-互斥量(mutex)
2015-07-25 17:49
686 查看
线程同步-互斥量(mutex)
关键区的范围,显然要尽可能的小。
CCPP Blog 目录
线程同步
多个线程同时访问共享数据时可能会冲突,于是需要实现线程同步。一个线程冲突的示例
#include <stdio.h> #include <unistd.h> #include <pthread.h> #define Loop 1000000 //全局资然 int counter = 0; void *fun(void *argv) { int i; for (i = 0; i < Loop; i++) { counter++; } return (void *)0; } int main(void) { int i; pthread_t pid[2]; for (i = 0; i < 10; i++) { counter = 0; pthread_create(&pid[0], NULL, fun, NULL); pthread_create(&pid[1], NULL, fun, NULL); pthread_join(pid[0], NULL); pthread_join(pid[1], NULL); printf("counter=%d\n", counter); } return 0; } //$ ./a.out //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 2000000 //counter = 1919439 //counter = 2000000如果Loop越大,想必结果不一样的可能性越大。
互斥量
互斥量(mutex)就是解决线程冲突的一种常见方法。#include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);对以上代码加上互斥量
//mutex.c #include <stdio.h> #include <unistd.h> #include <pthread.h> #define Loop 1000000 //初始化 pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; //全局资然 int counter = 0; void *fun(void *argv) { int i; for (i = 0; i < Loop; i++) { pthread_mutex_lock(&m); counter++; pthread_mutex_unlock(&m); } return (void *)0; } int main(void) { int i; pthread_t pid[2]; for (i = 0; i < 10; i++) { counter = 0; pthread_create(&pid[0], NULL, fun, NULL); pthread_create(&pid[1], NULL, fun, NULL); pthread_join(pid[0], NULL); pthread_join(pid[1], NULL); printf("counter=%d\n", counter); } pthread_mutex_destroy(&m); //销毁互斥量 return 0; }只需在需要同步的代码块加上“锁”即可。
关键区
被互斥量锁住的代码块,称作关键区(Critical Section):保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。关键区的范围,显然要尽可能的小。
CCPP Blog 目录
相关文章推荐
- ubuntu上创建账户和samba用户
- 深入理解Linux内核-定时测量
- Linux运维常用命令之sed
- linux awk命令详解
- Windows 7硬盘安装CentOS 6.4 双系统 (WIN7硬盘安装Linux(Fedora 16,CentOS 6.2,Ubuntu 12.04))
- linux(centos)搭建SVN服务器
- linux初学(三)之 文件基本操作管理
- 【Linux】Centos设置开机启动服务或者组件
- Linux iptables
- Kali Linux web渗透测试 学习笔记 1 系统安装
- 第一章:实验 访问命令行
- redhat6 配置centos6 yum替换
- 虚拟机复制后修改eth1为eth0
- 跨平台的目录遍历实现方法(windows和linux已经测试)
- Linux在device is busy处理
- Centos6.5_x64-GitLab搭建私有GitHub
- yum之如何手动创建本地yum仓库
- CentOS 6.X 挂载4TB的硬盘的方法
- Linux下的I/O复用
- Linux 下stat和access函数