【发布时间】:2020-06-06 23:35:11
【问题描述】:
我的目标是解决 Readers Writers[1] 问题,但仅使用孤立的进程。一个进程是写者的读者,我应该使用命名信号量,以便可以随时启动后续的读者和作者 - 而且我不能使用共享内存 - 纯同步。
更多信息: 提供 2 个实现阅读器的程序的实现,以及 编写器,以便可以在遵守限制的同时动态启动新进程。 注意并发处理的属性:安全性和活性。 还要考虑您的程序是否没有死锁。
编辑:问题分为 3 个文件 文件 1. 读者:
int main(){
sem_t *mutex;
sem_t *write;
int count=0;
mutex = sem_open("/mutex", O_CREAT, 0600, 1);
write = sem_open("/write", O_CREAT, 0600, 1);
do{
sem_wait(mutex);
count++;
if (count==1){
sem_wait(write);
}
sem_post(mutex);
printf("Critical section in readers\n");
sem_wait(mutex);
count--;
if(count==0)
sem_post(write);
sem_post(mutex);
}while(1);
}
文件 2. 编写器
int main(){
sem_t *write;
write = sem_open("/write", O_CREAT, 0600, 1);
do{
sem_wait(write);
printf("Critical section in writer\n");
sem_post(write);
}while(1);
return 0;
}
文件 3. 删除信号量
int main(){
sem_unlink("/mutex");
sem_unlink("/write");
printf("Semaphores deleted \n");
return 0;
}
问题:
- 当我使用 gcc -pthread file_name.c 运行
reader或writer时,我没有 得到任何结果,就像代码没有做任何事情一样 - 过程是 运行时,光标在闪烁,但没有任何反应。
[1]: READERS and WRITERS : 阅览室容量为 n 读者。读者来到阅览室,分配一个位置,占用一段时间,然后离开。过了一段时间,他们又来了,重复这个过程。阅览室也供作家使用。但是,只有当阅览室空置时,作者才能工作,即不能有其他读者或作者。作家在房间里呆了一会儿,然后离开,过一会儿又回来了
【问题讨论】:
-
如果您既不能使用共享内存也不能使用线程:您可以读取/写入文件并使用 fork/exec 来拥有进程而不是线程。不确定你需要 2 个信号量。尝试仅从 2 个进程开始:1 个读取器和 1 个写入器。
-
描述读写问题。
-
您确定您需要编写的程序负责“动态启动[ing]新进程”吗?鉴于您正在为 reader 和 writer 编写单独的程序,我的期望是启动 reader 和 writer 将是外部操作,而不是由程序本身管理的东西。这将大大降低每个程序的复杂性,并将重点放在似乎打算成为练习主题的同步对象上。
-
说到两个程序,您的代码似乎实现了具有两个功能的 一个 程序,而不是两个程序。
-
@JohnBollinger 您能否更具体地说明我应该在哪里分离代码以及如何将重点放在同步上?我完全是初学者,我承认我听不懂你说什么
标签: c linux concurrency fork semaphore