`
zy3381
  • 浏览: 157537 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

操作系统同步算法(二)

阅读更多
上一篇文章中,我们已经通过多线程以及互斥锁来实现了读写互斥的简单的读者写者算法。由于这种设计会存在一种线程“饿死”的情况,这里我们进行一下简单的改进,使得读写操作能够互斥并且交替的进行。

/**
**读写互斥问题
**读的时候不能写,写的时候不能读
**读写交替
**/
#include<stdio.h>
#include<pthread.h>
//声明一把互斥锁
pthread_mutex_t mutex;
//声明是否有内容可读的标志
int hasContent = 0;
void writer(void)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(hasContent == 0)
        {
            printf("writer加锁成功,开始写...\n");
            sleep(2);
            hasContent = 1;
            printf("writer写操作结束,释放互斥锁\n");
        }
        pthread_mutex_unlock(&mutex);
    }
}

void reader(void)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        if(hasContent == 1)
        {
            printf("reader加锁成功,开始读...\n");
            sleep(2);
            hasContent = 0;
            printf("reader读操作结束,释放互斥锁\n");
        }
        pthread_mutex_unlock(&mutex);
    }  
}

int main(void)
{
    printf("初始化互斥锁\n");
    pthread_mutex_init(&mutex,NULL);
    pthread_t thread_writer;
    pthread_t thread_reader;
    printf("开始读写线程\n");
    pthread_create(&thread_reader,NULL,(void *)reader,NULL);
    pthread_create(&thread_writer,NULL,(void *)writer,NULL);
    printf("回收线程\n");
    pthread_join(thread_reader,NULL);
    pthread_join(thread_writer,NULL);
    printf("运行结束\n");
    return 0;
}


相比于上一篇文章中的代码,这里最主要的改进就是增加了一个是否有文章可读的变量作为判断标识int hasContent=0,初始化为0表示默认是没有可读的内容的。

当读者线程开始运行后,首先进行加锁,如果加锁成功,判断是否有内容可读,如果没有,则不进行读操作,直接解锁,从而快速让出互斥锁的加锁权,让写者有机会加锁并写入内容。如果有内容可读,则进行读操作。

当写者线程开始运行后,首先进行加锁,如果加锁成功,判断是否内容已经被读者读完了,如果还没被读完,则不进行写操作,直接解锁,从而快速让出互斥锁的加锁权,让读者有机会加锁并读取内容。如果内容已经被读者读完了,则进行写操作。

可以简单理解为这是一种具有长度为1的缓冲区的读者写者问题。









分享到:
评论

相关推荐

    操作系统线程同步算法

    操作系统中的线程同步是多线程编程中一个关键的概念,它确保了多个线程在访问共享资源时的正确性,防止数据竞争和其他并发问题。在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等...

    计算机操作系统的十大算法

    在操作系统的设计与实现中,有十大核心算法,这些算法对于理解和优化操作系统至关重要。让我们深入探讨这些算法及其重要性。 1. **调度算法**:调度是操作系统管理处理器的关键部分,包括进程调度、I/O调度等。短...

    操作系统_进程同步算法习题精选.ppt

    操作系统_进程同步算法习题精选.ppt

    三种帧同步算法的MATLAB代码_帧同步matlab_帧同步算法_帧同步_

    本文将深入探讨三种常见的帧同步算法,并提供MATLAB代码实现,适合本科毕设项目参考。 1. **滑动窗口同步(Sliding Window Synchronization)** 滑动窗口同步是一种基本的同步方法,它依赖于在接收数据中寻找特定...

    操作系统的算法

    在操作系统的设计与实现中,算法起着至关重要的作用。本篇文章将深入探讨标题中提及的几个关键算法:多级调度算法、银行家算法、磁盘调度算法以及生产者-消费者问题。 1. **多级调度算法**: 多级调度算法是操作...

    操作系统实验二银行家算法

    操作系统是管理计算机硬件和软件资源的核心程序,而死锁是多进程环境中的一种常见问题,它发生在两个或多个进程互相等待对方释放资源而无法继续执行的情况。银行家算法是由E.F.科恩提出的,用于预防操作系统中的死锁...

    基于5G通信系统的时间同步算法matlab仿真,包含仿真操作录像,中文注释

    3.内容:基于5G通信系统的时间同步算法matlab仿真。 5G通信系统的时间同步需求主要源于对基站空口时间偏差的严格限定,这主要是为了避免上下行时隙干扰。对于4G TDD系统,采用固定子载波间隔15kHz,保护周期GP...

    操作系统算法实验报告

    实验二、线程和进/线程管道通信实验 实验三、进程调度算法实验 实验四、进程同步实验 实验五、进程互斥实验 实验六、死锁问题实验 实验七、内存页面置换算法实验 实验八、磁盘移臂调度算法实验 实验九、文件...

    操作系统算法实现(银行家算法 进程调度算法 页面置换算法)

    在操作系统的设计与实现中,有三个重要的算法:银行家算法、进程调度算法和页面置换算法。这些算法对于系统的性能和稳定性至关重要。 首先,让我们深入探讨银行家算法。这个算法主要用于预防操作系统的死锁问题。...

    分布式操作系统算法Demo

    分布式操作系统算法Demo是一种高级操作系统技术的实践展示,它涵盖了分布式系统和算法的核心概念。在现代计算机科学中,分布式操作系统是连接多台独立计算机,通过网络通信实现资源共享和协同工作的系统。这种系统...

    操作系统经典算法代码,java编写

    这个压缩包包含的是一系列用Java语言编写的操作系统经典算法,对于学习和理解操作系统的工作原理极其有价值。 1. **进程管理**: - **进程创建与销毁**:Java代码可能实现了创建新进程和结束进程的逻辑,这涉及到...

    操作系统实验各类算法的程序

    在这个"操作系统实验各类算法的程序"压缩包中,我们很可能会找到一系列与操作系统原理相关的代码实现,这些代码通常会涵盖以下几个关键知识点: 1. **进程管理**:在操作系统中,进程是程序的执行实例。这里可能...

    基于matlab无线传感器网络时间同步算法

    本主题将详细探讨基于MATLAB的无线传感器网络时间同步算法。 MATLAB是一种强大的开发环境,适用于数值计算、符号计算以及算法开发。在无线传感器网络时间同步领域,MATLAB可以用来设计、模拟和测试各种同步算法,如...

    操作系统各个算法模拟实现【java版】

    在这个【操作系统各个算法模拟实现【java版】】项目中,开发者通过Java语言和JSP(JavaServer Pages)以及线程技术,模拟了操作系统的几个关键算法,包括文件管理系统和内存分配策略,以帮助学习者更好地理解和应用...

    OFDM经典同步算法MATLAB程序

    OFDM(Orthogonal Frequency Division Multiplexing,...总之,"OFDM经典同步算法MATLAB程序"是一个实用的学习资源,可以帮助工程师和学生了解并实践OFDM系统中的关键同步步骤,提升无线通信领域的理论知识和编程技能。

    操作系统原理算法C语言实现

    本资源“操作系统原理算法C语言实现”为学习操作系统原理提供了实用的C语言代码示例,下面将详细探讨其中可能涵盖的知识点。 1. 进程管理:操作系统中的进程是程序执行的实例,涉及的概念包括进程创建、撤销、状态...

    操作系统算法

    在这个主题中,我们探讨了几个关键的操作系统算法,它们对于理解和优化系统的性能至关重要。 1. FIFO(先进先出)算法:这是一种最简单的页面替换算法,按照内存中的页面到达顺序进行淘汰。当内存满时,最先进入...

    同步机构 模拟实现同步机构 操作系统实验

    本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...

Global site tag (gtag.js) - Google Analytics