gpt4 book ai didi

c - 使用信号量的读者优先级

转载 作者:行者123 更新时间:2023-11-30 17:43:43 25 4
gpt4 key购买 nike

我正在做的一个项目遇到了困难,我想知道是否有人可以为我提供一些帮助。我会尝试简化我的代码,这样您就不会盯着 100 多行胡言乱语。我很确定只有第一个代码块是相关的,其他代码块是我在 sys.c 中的系统调用以供引用。

我应该创建一个程序来使用我自己的信号量来模拟进程同步的读取器优先级实现。当我运行它时,每当读者到达关键部分时,我就会陷入僵局。我不知道我做错了什么。

示例输出是:

作者 0 写了 - 6

作者 1 写了 - 4

作家 2 写了 - 2

读者 0 读 - 2

然后就卡住了。

据我所知,临界区信号量永远不会被释放。

我相信问题出在我的程序上,而不是我的信号量以及等待和信号操作,但我将它们包含在下面以供引用。

提前致谢。

到目前为止我的尝试如下:我省略了初始化和内存映射,这是基本结构

注释:RWwait 和 RWsignal 是包装方法,它们成功地对我的信号量操作进行系统调用。csMutex是控制对临界区的访问。nrMutex是控制临界区的读取队列两个互斥锁值最初都是 1。*number 是一个指向数字的指针,读者和作者都可以访问

int i;
//create writers
for(i=0; i < writers; i++){
if (fork()==0){
while(1){
RWwait(csMutex); //wait for the critical section and lock
*number = rand() % 10;
printf("Writer %d wrote- %d\n", i, *number);
RWsignal(csMutex);//unlock critical section
}
}
}

int nr = 0; //number of readers
//create readers
for(i=0; i < readers; i++){
if (fork()==0){
while(1){
RWwait(nrMutex);
nr++;

if (nr == 1)
RWwait(csMutex);
RWsignal(nrMutex);

printf("Reader %d read- %d\n", i, *number);

RWwait(nrMutex);
nr--;
if (nr == 0)
RWsignal(csMutex);
RWsignal(nrMutex);
}
}
}

这些是我在 sys.c 中的系统调用和结构再次强调,仅供引用

struct ProcQ {
struct task_struct *ts;
struct ProcQ *next;

};

struct RW_Sem {
int value;
char *type;
//Front and back nodes for the queue
struct ProcQ *front;
struct ProcQ *back;
};

等待操作:

asmlinkage long sys_RW_wait(struct RW_Sem *sem){
spin_lock(&sem_lock); //locks the program
sem->value -= 1; //decrement value

if (sem->value < 0){ //insert into queue
struct ProcQ *node; //create a new node for the queue
node = (struct ProcQ*)kmalloc(sizeof(struct ProcQ), GFP_KERNEL);
node->ts = current; //assign this process to task_struct
node->next = NULL; //assign the next node to null

if(sem->front == NULL){ //if the process queue is empty
sem->front = node;
sem->back = node;
}

else{ //if the queue is NOT empty
sem->back->next = node;
sem->back = node;
}
set_current_state(TASK_INTERRUPTIBLE); //sleep my child
spin_unlock(&sem_lock); //unlock
schedule();
}

else{ //queue bypass
spin_unlock(&sem_lock);
}
return 0;
}

信号操作:

asmlinkage long sys_RW_signal(struct RW_Sem *sem){
spin_lock(&sem_lock); //locks the program
sem->value += 1; //increment value


if(sem->value <= 0){ //wake up process, otherwise bypass
struct ProcQ *dqProc; //temporary node pointer for signaled process
struct task_struct *wake; //temp for task struct to wake
dqProc = sem->front;

if (dqProc != NULL) {
wake = dqProc->ts;
if(sem->front==sem->back){ //if only item in queue
sem->front = NULL;
sem->back = NULL;
}

else{
sem->front = dqProc->next;
}

wake_up_process(wake); //wake up!
kfree(dqProc); //free that space
}

}

spin_unlock(&sem_lock); //unlock
return 0; //success!

}

最佳答案

我会在你的读者中说:

        nr++;

if (nr == 1)
RWwait(csMutex);

是一个竞争条件。

同样我不会这样做:

        if (nr == 0)
RWsignal(csMutex);

关于c - 使用信号量的读者优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com