【发布时间】: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