c - 我想解决二进制信号量的读者/编写者问题

标签 c multithreading binary-semaphore

我有 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");
}

最佳答案

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

warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default] pthread_create(&reader[i], NULL, reader, &i);

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

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

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

关于c - 我想解决二进制信号量的读者/编写者问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341997/

相关文章:

c++ - 如何从 C++ 调用 Matlab 函数

c - openACC 传递结构列表

objective-c - 为核心数据写入创建后台线程

c - 信号量/互斥量和 Printf 之间的同步

Java:陷入无限循环

concurrency - Hoare Monitor 使用信号量实现?

C文件操作困惑

c - 使用c模拟x86 32位汇编运行

java - 确保Java线程确实被挂起

c - 意外的多线程服务器 react - C