最近接触了一些多线程的程序设计,主要涉及到使用多线程对一个缓冲区的数据进行读写。以前觉得多线程好像也不怎么难,到这时候才发现原来是自己所接触到的多线程程序太简单了。好了,废话不多说,直接切入主题,操作系统同步算法。
本科时候所学习的操作系统课程,里面有一个非常重要的部分是关于进程的同步,考试也是必考内容,以前一直感觉晕晕的,想不到这个时候验证了“出来混总是要还的”这句话。以前没理解好,现在来恶补一下。多线程作为现代操作系统的一个基本特征,很多地方和进程的设计理念是类似的,就比如同步算法。
我们知道,当多个线程同时运行时,是由操作系统对其进行调度,线程的运行顺序是我们无法控制的。这个时候,传统的结构化程序自顶向下的分析思想就显得捉襟见肘了。而事实是,不仅在程序分析上会变得很麻烦,程序对资源的访问的控制也需要进行非常仔细的掂量。关于“读脏”数据等并发引起的问题就不进行详细叙述。
我们来看第一个非常简单的例子,非常经典的读者/写者问题。
问题简单描述:有一个读者和一个写者,当写者在进行写作的时候,读者不能阅读,读者阅读的时候,写者不能进行写作。也就是说,读者和写者只能有一个运行,另外一个要阻塞。
算法是用C语言在Linux下实现的
/**
**读写互斥问题
**读的时候不能写,写的时候不能读
**
**/
#include<stdio.h>
#include<pthread.h>
//声明一把互斥锁
pthread_mutex_t mutex;
void writer(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
printf("writer加锁成功,开始写...\n");
sleep(2);
printf("writer写操作结束,释放互斥锁\n");
pthread_mutex_unlock(&mutex);
}
}
void reader(void)
{
while(1)
{
pthread_mutex_lock(&mutex);
printf("reader加锁成功,开始读...\n");
sleep(2);
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;
}
注意:编译的时候要加上-lpthread
编译命令示例:gcc -o mutex.exe mutex.c -lpthread
这个程序由于设计上不是很合理,会进入一个无限循环,所以在控制台下运行以后要使用Ctrl+C来强行结束程序的运行,不过不影响整个算法的主要流程。
我们运行以后可以发现一个很严重的问题,读者或者写者的其中一个可能会长期占据着互斥锁的加锁权,从而导致另外一个线程长期没有机会运行,导致一种线程“饿死”现象。
在实际的读写过程中,比较正常的一种简单情况是,先写再读,读写交替。下一篇文章我们来改进一下本文的算法,使其达到读写交替的目的。
分享到:
相关推荐
thread:未使用windows互斥信号量程序 thread2:使用windows互斥信号量程序 thread3:使用同步机制的peterson软件解决方案
操作系统_进程同步算法习题精选.ppt
实验一、进程控制实验 实验二、线程和进/线程管道通信实验 实验三、进程调度算法实验 实验四、进程同步实验 实验五、进程互斥实验 实验六、死锁问题实验 实验七、内存页面置换算法实验 实验八、磁盘移臂调度...
3.内容:基于5G通信系统的时间同步算法matlab仿真。 5G通信系统的时间同步需求主要源于对基站空口时间偏差的严格限定,这主要是为了避免上下行时隙干扰。对于4G TDD系统,采用固定子载波间隔15kHz,保护周期GP...
本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。 三. 实验题目 模拟PV操作同步机构,且用PV操作解决生产者—消费者问题。 运行环境:Microsoft Visual Studio ...
银行家算法在安全检查时用了两种不同方式 调度算法实现了先来先服务和短作业优先 页面置换实现了FIFO和LRU
适用操作系统第3版微课版
操作系统进程同步和互斥的实验报告。。。关于操作系统进程的同步与互斥问题的实验报告。
设计1:动态异长分区的存储分配与回收算法。 设计2:哲学家就餐问题与死锁。 设计3:假脱机打印程序与虚拟设备。 设计4:读者写者问题与进程同步。 设计5:索引文件,计算在混合索引文件的组织方式下,一个文件的...
用银行家算法避免死锁,实现系统合理分配资源,加深对进程同步及死锁理解。
操作系统实验报告_进程同步与互斥.doc
一个理发店,由一间等候室W和一间工作室B组成,理发店环境和运作示意图如下图所示。顾客可以从外面大街上进入W,等候理发。两个房间的入口是并排的且共享一扇日本式可...2)请用P、V操作写出这些进程的同步控制算法。
操作系统\进程同步补充习题算法最多允许4个哲学家同时进餐。 算法: Var n:semaphore:=4; Chopstick:array[0…4] of semaphore:=1,1,1,1,1; Begin Parbegin Chopsticki:repeat Wait(n); Wait(chopstick...
北大自考操作系统上机七个算法的完整代码。这七个算法会了,北大自考操作系统上机就是优秀了。我就是这样得到的优秀。跟大家分享下。10分很值哦。
1.领域:matlab,OFDM系统同步算法 2.内容:mOFDM系统下对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析+程序操作视频+word版说明文档 3.用处:用于SC算法,Minn算法,PARK算法同步性能编程学习 4.指向...
[计算机]操作系统 课程设计报告【生产者消费者同步算法】.doc
本实训的内容为实现一个模拟操作系统,模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理和文件管理四部分。 实训的基本原理主要包括操作系统中的进程的同步与互斥;常用的...
1。生产者消费者问题(信号量+mutex) 参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,...编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
操作系统实训报告进程同步和互斥通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原理。哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀...
有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:①允许多...