【发布时间】:2020-02-01 18:36:30
【问题描述】:
我正在开发一个读写器程序,其中一个作者对 n 个读者。我遇到了一个问题,如果有多个阅读器,就像下面发布的屏幕截图一样,那么共享内存中的整个消息都不会显示。
输出:
输入消息:测试
Reader1:测试
Reader2:测试
作者:测试测试
Reader1:测试
Reader2:测试测试
作家:
读者:
我试图添加一个计数变量,因为我假设在所有阅读器都能够打印之前,作者轮到被标记,它使作者然后退出编写器中的嵌套 while() 并阻止阅读器打印.
关于让读者都打印的任何建议,无论是旗帜还是某种计数?下面还附上 writer 和 reader 循环的屏幕截图。
读者:
int main() {
DataShared data;
data.turn = 0;
signal(SIGINT, sigHandler);
//generates key
key = ftok("mkey",65);
//returns an identifier in mId
if ((mId = shmget(key, SIZE, IPC_CREAT|S_IRUSR|S_IWUSR)) < 0){
perror("shared memory error");
exit(1);
}
// shmat to attach to shared memory
if((mPtr = shmat(mId, 0, 0)) == (void*) -1) {
perror("Can't attach\n");
exit(1);
}
while(1) {
// request critical section
while(!data.turn && data.count == 0) {
//not time for the reader, check if token is changed.
memcpy(&data, mPtr, sizeof(DataShared));
}
data.count++;
// enter critical section
usleep(1);
fprintf(stderr, "Read from memory: %s\n", data.message);
usleep(1);
// leave critical section
data.count--;
while(data.count > 0){
;
}
data.turn = 0;
memcpy(mPtr, &data, sizeof(DataShared));
};
return 0;
}
作者:
int main() {
DataShared data;
data.turn = 0;
data.count = 0;
signal(SIGINT, sigHandler);
key = ftok("mkey",65);
if((shmId = shmget(key, SIZE, IPC_CREAT|S_IRUSR|S_IWUSR)) < 0 ) {
perror("Error creating shared memory\n");
exit(1);
}
if((shmPtr = shmat(shmId, 0, 0)) == (void*) -1) {
perror("Can't attach\n");
exit(1);
}
while(1) {
while (data.turn) {
memcpy(&data, shmPtr, sizeof(DataShared));
}
// enter critical section
printf("Enter a message: \n" );
fgets(data.message, 1024, stdin);
// leave critical section
printf("Message written to memory: %s\n", data.message);
data.turn = 1;
memcpy(shmPtr, &data, sizeof(DataShared));
};
return 0;
}
【问题讨论】:
-
请删除图片并替换为文字。
-
@500-InternalServerError 我正在尝试在没有信号量或线程的情况下执行此操作。
-
@PaulOgilvie 不会因为标志永远不会保存到共享内存而改变从作者到读者的转变吗?
-
这里的排程看不懂。
-
请向我们展示您的主要内容,您从哪里开始阅读器和作者。