【问题标题】:I want to readers/writers problem with binary semaphore我想解决二进制信号量的读者/作者问题
【发布时间】:2019-10-13 23:16:33
【问题描述】:

我有 5 个作者,20 个读者。 我想用二进制信号量解决读写器问题。

但是我的代码有问题。存在分段错误(核心转储)。 我认为创建线程时存在问题。 我该如何解决这个问题?这是解决读写问题的正确代码吗? 我使用了教科书的伪代码。

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

sem_t mutex, rw_mutex;

int data = 0;
int readcount = 0;

void *reader(void* i)
{
    int num = *((int*)i);
    sem_wait(&mutex);
    readcount += 1; 
    if(readcount == 1)
            sem_wait(&rw_mutex);
    sem_post(&mutex);

    printf("I'm reader%d, data is %d \n", num, data);
    sem_wait(&mutex);

    readcount -= 1;
    if( readcount == 0)
            sem_post(&rw_mutex);
    sem_post(&mutex);
}

void *writer(void *i)
{
      int num = *((int*)i);
      sem_wait(&rw_mutex);
      data++;
      printf("I'm writer%d, data is %d\n", num, data);
      sem_post(&rw_mutex);
}

void main()
{
      int i;
      pthread_t writer[5], reader[20];
      sem_init(&rw_mutex, 0, 1);
      sem_init(&mutex, 0, 1);

      for(i=0; i<5; i++)
              pthread_create(&writer[i], NULL, writer, &i);
      for(i=0; i<20; i++)
              pthread_create(&reader[i], NULL, reader, &i);
      for(i=0; i<5; i++)
            pthread_join(writer[i], NULL);
      for(i=0; i<20; i++)
              pthread_join(reader[i], NULL);
      printf("End \n");
}

【问题讨论】:

  • 分段错误几乎总是表明您正在滥用内存,通常是通过尝试读取或写入程序可用地址之外的地址。在 Valgrind 等工具下运行代码将帮助您检测发生此类错误的位置。
  • @Yogesh 锁和信号量有不同的语义。它们不能相互替代。

标签: c multithreading binary-semaphore


【解决方案1】:

您是否检查过编译器发出的警告?我收到几个警告。一个例子是:

警告:从不兼容的指针类型传递“pthread_create”的参数 3 [默认启用] pthread_create(&reader[i], NULL, reader, &i);

问题是在main 中有一个名为reader 的数组,但在程序中还有一个名为reader 的函数。因此,当您实际需要该函数时,编译器(即至少我的编译器)会使用该数组。并且程序崩溃了。

修复警告!通过重命名函数 readerwriter 或重命名数组。

之后我再也看不到程序崩溃了。

【讨论】:

  • 我无法理解那个警告。感谢您给我警告的含义。但是还有另一个问题。我期望的结果是 reader[2] reader[3] 读了一些东西,而 writer[2] writer[3] 写了一些东西。但结果是我是 reader0,数据是 0 我是 writer0,数据是 1 我是 writer0,数据是 2 我是 writer0,数据是 3 我是 writer0,数据是 4 我是 writer0,数据是 5
  • 我该如何解决这个问题?
  • @su00 我认为您应该针对新问题提出新问题。这个问题是关于核心转储的。现在核心转储已解决,您有一个需要新问题的新问题。无论如何 - 传递 &amp;i 是个坏主意,但我不确定这是问题所在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多