互斥锁实验

简介: 互斥锁实验

这个代码上节我们知道如果进行进程并发执行,那么很可能值不唯一

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2;
// 票的数量: 全局变量
void* ticketAgent(void*
arg){
int t = ticketAmout;
if (t > 0){
printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
pthread_exit(0);
}
int main(int
argc, char const*
agrv[]){
pthread_t ticketAgent_tid[2];
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}
sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}

可以看到因为并发的问题执行结果不唯一

于是我们引入互斥锁来解决上面的问题,主要分三步走:

  1. pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; //创建一个锁
  2. pthread_mutex_lock(&lock); //上锁
  3. pthread_mutex_unlock(&lock); //开锁
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2;
// 票的数量: 全局变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* ticketAgent(void* arg){
// 上锁
pthread_mutex_lock(&lock);
int t = ticketAmout;
if (t > 0){
printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
// 解锁
pthread_mutex_unlock(&lock);
pthread_exit(0);
}
int main(int argc, char const* agrv[]){
pthread_t ticketAgent_tid[2];
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}
sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}

可以看到没有互斥的问题了

死锁的概念

如果一个进程打开了一个锁,但是不去释放这个锁,那么会发生什么呢

我们把释放锁的代码给注释掉

一直再loop根本运行不下去,这就是死锁。

相关文章
|
4月前
|
存储 安全 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
56 0
|
4月前
|
安全 算法 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
49 0
|
6月前
|
安全 编译器
互斥锁的优化与应用
互斥锁的优化与应用
89 0
|
12月前
信号量(上)实验
信号量(上)实验
52 0
|
12月前
信号量(下)实验
信号量(下)实验
37 0
|
12月前
|
算法
互斥锁原理
互斥锁原理
94 0
|
调度 C++
如何使用C++11原子操作实现自旋锁
C++自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。
225 1
|
关系型数据库 中间件 MySQL
上手全局锁,死锁
上手全局锁,死锁
上手全局锁,死锁
|
存储 算法 异构计算
SR锁存器与D锁存器设计与建模
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
199 0
SR锁存器与D锁存器设计与建模
|
存储 安全 Java