目录

前言

一、互斥锁是什么?

二、互斥锁的使用

三、代码实现过程

1.初始化互斥锁

2.互斥锁上锁

3.互斥锁解锁

4.互斥锁释放

5.代码示例

四、死锁


前言

线程通信只需要操作共享的进程数据段即可,虽然很容易,但也有其弊端,正因为并发的线程访问了相同的资源,所以造成了数据的不确定性。因此,线程的通信需要结合一些同步互斥机制一起使用

假如没有一些同步互斥机制,一个线程在读一个全局变量时,刚好另外一个线程在写这个全局变量,就容易造成数据的混乱


一、互斥锁是什么?

互斥锁是用以保护对共享资源的操作,即保护线程对共享资源的操作代码可以完整执行,而不会在访问的中途被其他线程介入对共享资源访问。通常把对共享资源操作的代码段,称之为临界区,其共享资源也可以称为临界资源。于是这种机制——互斥锁的工作原理就是对临界区进行加锁,保证处于临界区的线程不被其他线程打断,确保其临界区运行完整

二、互斥锁的使用

1.使用之前需要先初始化一个互斥锁

2.如果线程加锁成功,则可以访问共享资源,期间不会被打断,在访问结束之后解锁

3.线程在进行上锁时,其锁资源被其他线程持有,那么该线程则会执行阻塞等待,等待锁资源被解除之后,才可以进行加锁

4.互斥锁并不能保证线程的执行先后,但却可以保证对共享资源操作的完整性

5.图示:

三、代码实现过程

互斥锁的使用包括初始化互斥锁、互斥锁上锁、互斥锁解锁、互斥锁释放

1.初始化互斥锁

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

参数:

mutex用来指定互斥锁额标识符,类似于ID,其类型为pthread_mutex_t;

attr为互斥锁的属性,一般设置为NULL

2.互斥锁上锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

3.互斥锁解锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);

4.互斥锁释放

pthread_mutex_destroy(pthread_mutex_t *mutex)

5.代码示例

此示例创建了五个线程,给五个线程的执行函数一样,给执行函数加锁,保证了每个线程执行程序的完整性

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NUM_THREADS 5
pthread_mutex_t lock1,lock2;
int k;
void *PrintHello(void *tt)/* 线程函数 */
{long tid;int i,j;tid = (long)tt;while(1){   sleep(2);pthread_mutex_lock(&lock1);//上锁1printf("It's thread #%ld begining!\n", tid);/* 打印线程对应的参数 *///sleep(5);
/*         for(i=0;i<55555;i++)for(j=0;j<9999;j++);//消耗cpu,延时 */pthread_mutex_lock(&lock2);//上锁2for (k = 0; k < 5; k++) { printf("thread #%ld Job %d printing \n", tid,k); for(i=0;i<100000;i++)for(j=0;j<6666;j++);}   printf(" thread #%ld is over!\n", tid); pthread_mutex_unlock(&lock2);//一个线程中操作多个互斥锁时,加锁与解锁的顺序一定是相反的pthread_mutex_unlock(&lock1);//解锁1/* 线程先加锁1,后加锁2,之后一定要先解锁2,再解锁1 */}
}int main (int argc, char *argv[])
{pthread_t threads[NUM_THREADS];long t;for(t=0; t<NUM_THREADS; t++){   /* 循环创建 5 个线程 */printf("In main: creating thread %ld\n", t);pthread_create(&threads[t], NULL, PrintHello, (void *)t); /* 创建线程,系统自动分配资源 */} pthread_mutex_init(&lock1,NULL);//初始化互斥锁pthread_mutex_init(&lock2,NULL);//初始化互斥锁while(1);
}

注意:

一个线程中操作多个互斥锁时,加锁与解锁的顺序一定是相反的,否则也会导致错误。例如上述示例,如果线程先加锁1,后加锁2,之后一定要先解锁2,再解锁1

四、死锁

多个线程对多个互斥锁交叉使用,每一个线程都试图对其他线程所持有的互斥锁进行加锁。如图所示的情况,线程分别持有了对方需要的锁资源,并相互影响,可能会导致程序无限阻塞,就会造成死锁

线程同步互斥机制--互斥锁相关推荐

  1. LINUX线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量等

    注:摘自<程序员的自我修养>相关章节. 原子操作 共享数据(全局变量或堆变量)的自增(++)操作在多线程环境下会出现错误是因为这个操作(一条c语句)被编译为汇编代码后不止一条指令,因此在执 ...

  2. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...

    本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...

  3. 回顾线程的竞争机制-重量级锁

    如果Thread#1和Thread#2正常交替执行,那么轻量级锁基本能够满足锁的需求.但是如果Thread#1和Thread#2同时进入临界区,那么轻量级锁就会膨胀为重量级锁,意味着Thread#1线 ...

  4. 回顾线程的竞争机制-轻量级锁

    偏向锁的场景太过于理想化,更多的时候是Thread#2也会尝试进入临界区, 如果Thread#2也进入临界区但是Thread#1还没有执行完同步代码块时,会暂停Thread#1并且升级到轻量级锁.Th ...

  5. 回顾线程的竞争机制-偏向锁

    此时当Thread#1进入临界区时,JVM会将lockObject的对象头Mark Word的锁标志位设为"01",同时会用CAS操作把Thread#1的线程ID记录到Mark W ...

  6. linux线程基础篇----线程同步与互斥

    linux线程基础----线程同步与互斥 一.同步的概念 1.同步概念  所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两个设备   ...

  7. 『Linux』第九讲:Linux多线程详解(三)_ 线程互斥 | 线程同步

    「前言」文章是关于Linux多线程方面的知识,上一篇是 Linux多线程详解(二),今天这篇是 Linux多线程详解(三),内容大致是线程互斥与线程同步,讲解下面开始! 「归属专栏」Linux系统编程 ...

  8. C#多线程编程系列(三)- 线程同步

    目录 1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEven ...

  9. JAVA并发编程3_线程同步之synchronized关键字

    在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public clas ...

最新文章

  1. java快排算法解读,java 快排的思路与算法
  2. python中有没有switch_Python为什么没有switch/case语句?
  3. SAP修改数据表(tables)的方法
  4. 抓包oracle密码,Oracle TNS 协议抓包分析
  5. 有多个重载参数pow_随时随地想充就充,同时最多能给三部手机充电的南卡无线充电宝POW-1体验...
  6. 锦州哪家计算机学校好,锦州十大排名中专
  7. HTML5新增的表单元素有哪些?
  8. 蛋白+小分子配体md(详细保姆教程)
  9. java 生成war包_java利用Ant脚本生成war包全过程
  10. Verilog HDL实现智能药盒
  11. Redhat、Fedora、CentOS、OEL之间的关系与不同。
  12. 22-02-08数据库迁移sql问题
  13. 如何查找国内各大学本科学位论文?
  14. 帝国塔防2 empire defence 2的攻略
  15. 华三h3c系列交换机ACL实践
  16. Linux命令之shred命令
  17. 随时标注各种物件,一个小标签机就能搞定,汉印M11体验
  18. 需求工程中的面谈和原型
  19. Spring Security 安全框架
  20. 清楚浮动四种常用方法

热门文章

  1. minHash最小哈希
  2. Linux_Wget
  3. SPWM与SVPWM的比较
  4. 系统安全: GeneXus 新身份验证方案
  5. MacBook安装Windows系统后耗电快的原因在这里
  6. Python输入密码
  7. matlab中的strfind和findstr函数
  8. HTTPS 前端劫持
  9. 台式计算机使用寿命,台式机主机一般寿命是多久?
  10. Educoder Python 计算思维训练——文件操作与异常处理