C-读写器(并发):分叉和;信号量输出
我正在编写一个读者/作者关于信号量和分叉(这是必需的,而不是pthreads)问题的实现 这是读卡器的首选项,基本上是用户指定读卡器/写卡器的数量,程序根据每个读卡器/写卡器的请求数量进行分叉。编写者选择一个随机数,将其写入关键部分,并将其报告给控制台。读者只需报告当前的数字 我使用信号量来管理它,出于某种原因,一旦一个进程控制了关键部分,它就会在允许下一个进程访问它之前遍历所有预定数量的循环。我觉得这可能与我在main中的fork()ing循环有关,尽管我不确定 编辑:对不起,如果我问的不是很清楚;下面的输出显示了每个进程(读卡器1、写卡器1等),每个进程在一行中访问关键部分两次(如果我将迭代次数增加到10次,这将是10倍),这不是我想要的。它应该有一个更随机的输出(每个进程访问它一次,然后将其传递出去)。我不知道为什么每个进程都能像现在这样阻止访问 代码如下:C-读写器(并发):分叉和;信号量输出,c,concurrency,fork,semaphore,C,Concurrency,Fork,Semaphore,我正在编写一个读者/作者关于信号量和分叉(这是必需的,而不是pthreads)问题的实现 这是读卡器的首选项,基本上是用户指定读卡器/写卡器的数量,程序根据每个读卡器/写卡器的请求数量进行分叉。编写者选择一个随机数,将其写入关键部分,并将其报告给控制台。读者只需报告当前的数字 我使用信号量来管理它,出于某种原因,一旦一个进程控制了关键部分,它就会在允许下一个进程访问它之前遍历所有预定数量的循环。我觉得这可能与我在main中的fork()ing循环有关,尽管我不确定 编辑:对不起,如果我问的不是很
#include <stdlib.h>
#include <stdio.h>
#include <sys/mman.h>
#include "asm/unistd.h"
#include <semaphore.h>
#define ITERATION 2
int *readCount, *crit_sec;
sem_t wrt, mutex, *s1, *s2;
void writer (int numWriter) {
sem_wait(&wrt);
*crit_sec = rand() % 100 + 1;
printf("Writer %d - Wrote: %d\n", numWriter, *crit_sec);
sem_post(&wrt);
return;
}
void reader (int numReader) {
sem_wait(&mutex);
*readCount++;
if (*readCount == 1) sem_wait(&wrt);
sem_post(&mutex);
printf("Reader %d - Read: %d\n", numReader, *crit_sec);
sem_wait(&mutex);
*readCount--;
if (*readCount==0) sem_post(&wrt);
sem_post(&mutex);
return;
}
int main (int argv, char **argc) {
int numRead, numWrite;
void *ptr1 = mmap(NULL, 2*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
void *ptr2 = mmap(NULL, 2*sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
crit_sec=ptr1, readCount=ptr1+1;
*crit_sec=0, *readCount=0;
s1=ptr2, s2=ptr2+1;
*s1=mutex, *s2=wrt;
sem_init(&mutex,1,1);
sem_init(&wrt,1,1);
if (argv !=3) {
printf("Incorrect usage - must use: ./ReadersWriters [# readers] [# writers]\n");
return 0;
}
if (sscanf (argc[1], "%i", &numRead)!=1|| sscanf (argc[2], "%i", &numWrite)!=1) {
printf("Incorrect usage - must use: ./ReadersWriters [# readers] [# writers]\n");
return 0;
}
int rcnt = 0;
while (rcnt++ < numRead) {
if (fork()==0) {
int i=0;
for(;i<ITERATION;i++) reader(rcnt);
return;
}
}
int wcnt = 0;
while (wcnt++ < numWrite) {
if (fork()==0) {
int j=0;
for (;j<ITERATION;j++) writer(wcnt);
return;
}
}
return 0;
}
谢谢你的帮助
抱歉,我的意思是我不希望每个进程都控制 关键部分在一行中进行多次迭代,而不进行交接 如果调用e,调度程序不必切换到另一个线程。g
sem_post()
,特别是不使用标准调度策略SCHED_OTHER
(请参阅人工调度设置调度器
)。也就是说,通过定义迭代5,我有时会得到e。g、 :
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 1 - Read: 0
Reader 1 - Read: 0
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 2 - Read: 84
Reader 2 - Read: 84
Writer 1 - Wrote: 84
Writer 1 - Wrote: 87
Writer 2 - Wrote: 84
Writer 2 - Wrote: 87
Writer 2 - Wrote: 78
Writer 1 - Wrote: 78
Writer 2 - Wrote: 16
Writer 1 - Wrote: 16
Writer 2 - Wrote: 94
Writer 1 - Wrote: 94
你的问题是什么?对不起,我的意思是,我不希望每个流程都能连续多次控制关键部分的迭代,而不进行交接。如果我将迭代宏增加到10,那么您将看到每个进程连续访问它10次——这是无用的。
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 1 - Read: 0
Reader 1 - Read: 0
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 1 - Read: 0
Reader 2 - Read: 0
Reader 2 - Read: 84
Reader 2 - Read: 84
Writer 1 - Wrote: 84
Writer 1 - Wrote: 87
Writer 2 - Wrote: 84
Writer 2 - Wrote: 87
Writer 2 - Wrote: 78
Writer 1 - Wrote: 78
Writer 2 - Wrote: 16
Writer 1 - Wrote: 16
Writer 2 - Wrote: 94
Writer 1 - Wrote: 94