进程互斥和线程互斥
发布日期: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_add1thread_add2thread1thread2)。
  • 等待线程完成:使用 pthread_join 等待所有线程结束。
  • 输出结果:根据 global_flag 控制输出效果。
  • 总结性比较

    两次实验的主要区别在于具体的操作常数和信号量初始化方式,但核心思想相同。通过两种方式验证同步机制的正确性。

    ---=seotag**

    1. 进程互斥与线程互斥实现

    1.1 它们的区别与优缺点

    在操作系统中,进程互斥使用信号量,而线程互斥通常使用互斥锁。 progressA.c 和 progressB.c 实现的均为多线程程序的同步控制。

    上一篇:消息队列用于双向进程通信
    下一篇:Ubuntu下创建虚拟调试串口

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月15日 22时41分20秒