
进程互斥和线程互斥
项目启动:创建共享内存段和信号量。 开始四个线程:两对线程( 等待线程完成:使用 输出结果:根据
发布日期:2021-05-10 05:07:20
浏览次数:18
分类:精选文章
本文共 1637 字,大约阅读时间需要 5 分钟。
进程互斥与线程互斥是操作系统中常见的同步控制方法。在本次实验中,我们将围绕两种不同的多线程程序设计探索两种技术的实现方式。项目分为两个部分:progressA.c和progressB.c。
设计与实现
基本思路
- 目标:验证进入技术(进程互斥)和线程互斥同步的正确性。
- 范围:使用C语言编写多线程程序,通过信号量和互斥锁实现进程互斥和线程互斥。
编译与运行
-
progressA.c
- 编译命令:
gcc progressA.c -o progressA -lpthread -lrt
- 执行命令:
./progressA
- 编译命令:
-
progressB.c
- 编译命令:
gcc progressB.c -o progressB -lpthread -lrt
- 执行命令:
./progressB
- 编译命令:
测试环境
- 工具:g++编译器
- 运行环境:Linux系统
- 依赖库:
-lpthread
( POSIX 线程库) - 库函数:
-lrt
(实时线程支持库)
核心代码分析
sharedmemory 结构体定义
struct sharedmemory { int data[20]; // 数据域};pthread_mutex_t g_mutex; // 互斥锁sem_t * sem = NULL; // 有名信号量指针
共享内存的使用
#define SHAREDMEMORYFILE "data.d" // 共享文件名struct sharedmemory *ptr;// 共享内存初始化int fd = shm_open(SHAREDMEMORYFILE, O_RDWR|O_CREAT, 0777);ptr = mmap(NULL, sizeof(struct sharedmemory), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);write(fd, " ", sizeof(struct sharedmemory));memset(ptr->data, 0, sizeof(ptr->data));close(fd);
progressA.c 的主要逻辑
线程互斥实现
- thread_add1 和 thread_add2:这些函数通过自旋锁实现线程互斥。
- 使用
pthread_mutex_lock
加锁和pthread_mutex_unlock
解锁操作同步访问共享变量。 - 增加循环次数(如设置为5,000,000)以提高冲突概率,使得错综不乱更容易观察。
- 使用
进程互斥实现
- thread1 和 thread2:这些函数通过信号量实现进程互斥。
- 使用
sem_wait
等待信号量降低到0,再sem_post
发送信号量。 - 加互斥锁同步数据访问,确保每个进程单独运行时不会互相干扰。
- 使用
progressB.c 的主要区别
- thread1 和 thread2 所使用的初始化常数和操作值:与 progressA.c 中的实现类似,但测试参数略有不同(如99与55)。
- 信号量初始化:张idental的初始值设置为1。
- 互斥锁初始化:使用
pthread_mutex_init
默认属性初始化互斥锁。
典型执行流程
thread_add1
和 thread_add2
,thread1
和 thread2
)。pthread_join
等待所有线程结束。global_flag
控制输出效果。总结性比较
两次实验的主要区别在于具体的操作常数和信号量初始化方式,但核心思想相同。通过两种方式验证同步机制的正确性。
---=seotag**
1. 进程互斥与线程互斥实现
1.1 它们的区别与优缺点
在操作系统中,进程互斥使用信号量,而线程互斥通常使用互斥锁。 progressA.c 和 progressB.c 实现的均为多线程程序的同步控制。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月15日 22时41分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SpringBoot找不到@EnableRety注解
2019-03-07
简易计算器案例
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
Kali Linux 内网渗透教程 - ARP欺骗攻击 | 超详细
2019-03-07
2020Java程序设计基础(华东交通大学)章节测试免费满分答案
2019-03-07
小程序之wx:request(转)
2019-03-07
解决数据库报ORA-02289:序列不存在错误
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08
成功解决升级virtualenv报错问题
2019-03-08
【SQLI-Lab】靶场搭建
2019-03-08
Xception 设计进化
2019-03-08
【Bootstrap5】精细学习记录
2019-03-08
SkyWalking性能剖析
2019-03-08
LeetCode197.打家劫舍
2019-03-08
A simple problem HDU-2522 【数学技巧】
2019-03-08
487-3279 POJ-1022【前导0~思维漏洞】
2019-03-08