当前位置: 首页 > 知识库问答 >
问题:

如何检测读写问题中的饥饿

岑彬炳
2023-03-14

我对这段代码有一个问题。这是典型的读者-作家问题。我按照这个维基百科页面上的伪代码找到了第一个让作者挨饿的问题。我想知道我实际上是如何注意到作家们正在挨饿的。

我试着把shared_variable的打印声明放在不同的地方,但这并没有给我太多的洞察力。但也许我只是不明白发生了什么。有人能向我解释一下我是如何直观地看到饥饿发生的吗?谢谢你!读取器或写入器尝试读取或写入的次数作为命令行参数给出。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>


// Compile it like so: gcc assignment2.c -lpthread


// Shared variables (semaphore and integer)
static sem_t rw_mutex;
static sem_t mutex;
static int read_count = 0;

// Shared variable
int shared_variable = 0;

static void *writerAction(void *arg){
    int number_attempt = *((int *) arg);
    int attempt = 0;
    do{
        sem_wait(&rw_mutex);
        shared_variable = shared_variable + 10;
        sem_post(&rw_mutex);
        attempt++;
    }while(attempt < number_attempt);
}

static void *readerAction(void *arg){
    int number_attempt = *((int *) arg);
    int attempt = 0;
   do{
        sem_wait(&mutex);
        read_count++;
        // waiting to be able to read for the possible writer
        if (read_count == 1 ){
            sem_wait(&rw_mutex); // get the lock so that writter can't write!
        }

        // Release the read_count variable
        sem_post(&mutex);
        sem_wait(&mutex);
        read_count--;

        if (read_count == 0){
            sem_post(&rw_mutex); // release the lock so that writter can write
        }
        sem_post(&mutex);
        attempt++;
    } while(attempt < number_attempt);
}




int main(int argc, char *argv[]) {

    int number_writers = 10;
    int number_readers = 500;
    int reader_repeat_count = atoi(argv[2]);
    int writer_repeat_count = atoi(argv[1]);

    // Instantiating the threads for the writters and readers
    pthread_t writer_threads[number_writers];
    pthread_t reader_threads[number_readers];

    // Initation of semaphores
    sem_init(&rw_mutex, 0, 1);
    sem_init(&mutex, 0, 1);

    printf("Start creation of Readers\n");
    for(int i = 0; i <number_readers; i++){
        pthread_create(&reader_threads[i], NULL, readerAction, &reader_repeat_count);
    }
    printf("Start creation of Writers\n");
    for(int i = 0; i < number_writers; i++){
        pthread_create(&writer_threads[i], NULL, writerAction, &writer_repeat_count);
    }

    // All the actions is hapenning here
    printf("Wait for Readers\n");
    for(int i = 0; i < number_readers; i++){
        printf("Waiting for : %d\n",i);
        pthread_join(reader_threads[i], NULL);
    }

    printf("Wait for Writers\n");
    // Collect all the writers
    for(int i = 0; i < number_writers; i++){
        printf("Waiting for : %d\n",i);
        pthread_join(writer_threads[i], NULL);
    }

    // Results
    printf("The shared variable is : %d\n",shared_variable);
   }

共有1个答案

曹季同
2023-03-14

首先有一个语法错误,writerAction和readerAction的返回类型应该是void而不是void*

为了看到作家饥饿,你可以在作家试图获得rw_mutex之前打印“作家试图写作”,呼吁sem_wait(

// Release the read_count variable
sem_post(&mutex);
printf("reader reading shared value %d\n", shared_variable);

现在,当你运行具有大量重复计数的代码时,你会看到“作者试图写入”,然后你会看到大量的读者打印输出,而不是来自作者更新共享变量的输出,这将证明读者正在饿死作者不允许它更新变量。

 类似资料:
  • 问题内容: 我对* nix系统上的POSIX Pthreads中的读写锁定有一些疑问,例如Linux。 我想知道读写锁定的默认偏差是什么,即,它优先于读取而不是写入,反之亦然?它是否提供一些api来更改此默认行为。 posix pthread是否提供一些api,以便我们可以更改pthread_rwlock_t来防止作者饥饿?从我所阅读的内容(如果我错了,请纠正我),默认实现偏向于读者线程,因此作家

  • 本文向大家介绍读写问题,包括了读写问题的使用技巧和注意事项,需要的朋友参考一下 读写程序问题与多个进程之间共享的对象(例如文件)有关。这些过程中的一些是读取器,即他们只想从对象中读取数据,而某些过程是写入器,即他们想写到对象中。 读者-作家问题用于管理同步,因此对象数据没有问题。例如-如果两个读取器同时访问对象,则没有问题。但是,如果两位作者或一位读者和一位作家同时访问该对象,则可能会出现问题。

  • 我有一个关于Firestore数据库中读/写的问题。情况是: 我有一个集合“城市”(例如20个城市),它有一个子集合“餐厅”(例如500家餐厅): 现在我的问题是:当我想得到一个城市中的所有餐厅时,FiRecovery会支付多少次读取费用?500? 当我想添加一家餐厅时:是否只需要写一封信就可以将此文档添加到子集合中?

  • 当Android应用程序没有响应时,会弹出一个ANR对话框。我的问题是:Android平台如何检测ANR,并决定启动这样一个弹出对话框。

  • 问题内容: 我正在尝试通过URLConnection上传文件,但是我需要将其读取/写入为二进制文件,而无需进行任何编码更改。 所以我试图从读取数组,但是现在我有一个问题。我用于输出到服务器的对象不允许我执行操作(类型为)。我怎样才能解决这个问题?还是有另一种快速将二进制数据从a复制到a的方法? 谢谢 问题答案: 对象(包括)专门用于输出字符数据。听起来您想要这里而不是这里。 你是哪里人 如果它是通

  • 维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了?链接:读者和作者问题 请看链接中的第三个