同步

同一个进程中的多个线程共享所在进程的内存资源,当多个线程在同一时刻同时访问同一种共享资源时,需要相互协调,以避免出现数据的不一致和覆盖等问题,线程之间的协调和通信的就叫做线程的同步问题, 线程同步的思路: 让多个线程依次访问共享资源,而不是并行

互斥VS同步

  • 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。如果操作是原子操作,那么天然的具有互斥
  • 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

互斥量Mutex:

  • 本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。互斥量使同时只能有一个线程访问数据,可以看做一种的0/1信号量
  • Mutex对象的值只有0和1。分别代表了Mutex的锁定状态和空闲状态:
    • 锁定状态:当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入等待;
    • 空闲状态:当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。
  • Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。
  • 在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。

互斥量模型

#include <pthread.h>
pthread_mutex_t mutex //定义互斥锁
pthread_mutex_init() //初始化锁
pthread_mutex_lock()/pthread_mutex_trylock() ... //加锁
pthread_mutex_unlock() //解锁
pthread_mutex_destroy() //销毁
//成功返回0,失败返回error number
#include <pthread.h>
int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock (pthread_mutex_t *mutex);
int pthread_mutex_trylock (pthread_mutex_t *mutex);
int pthread_mutex_unlock (pthread_mutex_t *mutex);
int pthread_mutex_destroy (pthread_mutex_t *mutex);

死锁deadlock

死锁主要发生在有多个依赖锁存在时,会在一个线程试图与另一个线程沿着相反的顺序锁住互斥量时发生

黑球线程按照A->的方向使用共享资源,同时白球线程按照B->A的顺序使用共享资源,不巧的是,黑球线程锁定A资源直到获得了释放了的B资源,白球线程锁定B资源直到获得了释放了的A资源,最后的结果就是他们都不能获得自己想要的资源,都锁定着对方想要的资源

解决死锁:

  • 对共享资源操作前一定要获得锁
  • 完成操作后一定要释放锁
  • 尽量短的时间占用锁
  • 如果有多锁,如获得的顺序是ABC顺序,那么释放顺序也该是ABC
  • 线程错误返回时会释放它所获得的锁

例子

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h> char* buf[5];
int pos;
//1.定义互斥量
pthread_mutex_t mutex;
void* task(void* pv){
//3.使用互斥量进行加锁
pthread_mutex_lock(&mutex); //4.访问共享内存
buf[pos]=(char*)pv;
sleep(1);
pos++; //5.使用互斥量进行解锁
pthread_mutex_unlock(&mutex);
}
main(){
//2.初始化互斥量
pthread_mutex_init(&mutex,NULL); pthread_t thread;
pthread_create(&thread,NULL,task,(void*)"zhangfei");
pthread_t thread2;
pthread_create(&thread2,NULL,task,(void*)"guanyu"); pthread_join(thread,NULL);
pthread_join(thread2,NULL); //打印字符指针数组中的有效数据
int i=0;
for(i=0;i<pos;i++){
printf("%s ",buf[i]);
}
printf("\n");
//6.如果不再使用则销毁互斥量
pthread_mutex_destroy(&mutex);
return 0;
}

Linux 多线程互斥量互斥的更多相关文章

  1. linux多线程编程之互斥锁

    多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #in ...

  2. 笔记3 linux 多线程 条件变量+互斥锁

    //cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { ...

  3. Linux多线程——使用互斥量同步线程

    前文再续,书接上一回,在上一篇文章: Linux多线程——使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两 ...

  4. Linux多线程--使用互斥量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...

  5. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  6. windows多线程(五) 互斥量 Mutex

    一.互斥量 互斥量是windows的一个内核对象,互斥量与关键段的作用相似,可以用来确保全局资源的互斥访问.并且互斥量可以用在不同的进程中的线程互斥访问全局资源. 二.相关函数说明 使用互斥量Mute ...

  7. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  8. POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t 和pthread_cond_t的一系列的封装.因此通过 ...

  9. 并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

随机推荐

  1. Hewlett-Packard Enterprise 实习总结日记

    人生的第一份正式的实习工作时在HP,受益颇多.突然要离开了,还是非常舍不得的.在公司实习这半年多时间,写篇博客,对这期间的成长经历做一些总结.先说一个典故:我叫史蒂夫·乔布斯,我想找一些零件来做一台频 ...

  2. 《Java4android》视频学习笔记——面向对象的应用(一)

    ---恢复内容开始--- 有一台HP打印机需要一个程序来实现开机,打印,关机这三个功能 class HPprinter { void open(){ System.out.println(" ...

  3. HDU 5703 Desert 水题 找规律

    已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这 ...

  4. 配置云服务器 FTP 服务

    自己配置的环境: OS: 阿里云 CentOS 6.5 >>Begin: 1. 登录到阿里云服务器(如何登录阿里云服务器), 在root权限下, 通过如下命令安装 vsftp [root@ ...

  5. git node(&npm)安装

    1.git 下载地址:https://git-scm.com/download/win 2.node 下载地址:https://nodejs.org/en/download/ 安装node会自带npm ...

  6. Refusing to install webpack as a dependency of itself

    用npm安装webpack的时候报了这个错: Refusing to install webpack as a dependency of itself 翻译过来大概是:'拒绝安装webpack其本身 ...

  7. 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置

    简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...

  8. 编译Android系统源码(高通平台)

    在Android源码根目录执行下面命令 source build/envsetup.sh choosecombo make –j4 其他命令(首先需要在android源码根目录执行source bui ...

  9. Android NDK编译本地文件以及引用第三方so文件

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS :=-llog LOCAL_MODULE := DeviceAPI LO ...

  10. Android jni开发中的常见错误

    错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用Syst ...