C-读写器(并发):分叉和;信号量输出

C-读写器(并发):分叉和;信号量输出,c,concurrency,fork,semaphore,C,Concurrency,Fork,Semaphore,我正在编写一个读者/作者关于信号量和分叉(这是必需的,而不是pthreads)问题的实现 这是读卡器的首选项,基本上是用户指定读卡器/写卡器的数量,程序根据每个读卡器/写卡器的请求数量进行分叉。编写者选择一个随机数,将其写入关键部分,并将其报告给控制台。读者只需报告当前的数字 我使用信号量来管理它,出于某种原因,一旦一个进程控制了关键部分,它就会在允许下一个进程访问它之前遍历所有预定数量的循环。我觉得这可能与我在main中的fork()ing循环有关,尽管我不确定 编辑:对不起,如果我问的不是很

我正在编写一个读者/作者关于信号量和分叉(这是必需的,而不是pthreads)问题的实现

这是读卡器的首选项,基本上是用户指定读卡器/写卡器的数量,程序根据每个读卡器/写卡器的请求数量进行分叉。编写者选择一个随机数,将其写入关键部分,并将其报告给控制台。读者只需报告当前的数字

我使用信号量来管理它,出于某种原因,一旦一个进程控制了关键部分,它就会在允许下一个进程访问它之前遍历所有预定数量的循环。我觉得这可能与我在main中的fork()ing循环有关,尽管我不确定

编辑:对不起,如果我问的不是很清楚;下面的输出显示了每个进程(读卡器1、写卡器1等),每个进程在一行中访问关键部分两次(如果我将迭代次数增加到10次,这将是10倍),这不是我想要的。它应该有一个更随机的输出(每个进程访问它一次,然后将其传递出去)。我不知道为什么每个进程都能像现在这样阻止访问

代码如下:

#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