C Reader Writer 程序,一个 reader 没有读取所有数据
C Reader Writer Program, One reader isnt reading all the data
我正在开发一个 reader/writer 程序,其中有 n reader 位作者。我遇到一个问题,如果有多个 reader,就像下面发布的屏幕截图一样,则不会显示来自共享内存的整个消息。
输出:
输入消息:测试
Reader1: 测试
Reader2:测试
作者:测试测试
Reader1: 测试
Reader2:测试测试
作者:
Readers:
我尝试添加一个计数变量,因为我假设在所有 reader 能够打印之前标记编写器,然后它使编写器退出嵌套的 while() writer 并停止打印 readers。
关于使 reader 都打印的任何建议,无论是标志还是某种计数?下面还附上了作者和 reader 循环的屏幕截图。
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;
}
这可能不是你的观察的解释,但你的做法很可疑。
您有多个进程,OS 安排每个进程。
首先,不能保证所有 reader 都会阅读该消息。很有可能一个 reader 完成,将标志设置为 0,然后在另一个 reader 有机会读取数据之前将数据复制回共享内存。
然后是你的 data.count
。它以编写器的局部变量 data
开头。在那里你没有初始化 data.count
所以它有一个不确定的值。在 readers 中,您将其设置为 0,但它将被共享内存中的值(不确定值)覆盖。你先做一个 ++,然后再做一个 -- 然后等待它变成 0。那怎么会变成零呢? reader 可以永远等待。
我正在开发一个 reader/writer 程序,其中有 n reader 位作者。我遇到一个问题,如果有多个 reader,就像下面发布的屏幕截图一样,则不会显示来自共享内存的整个消息。
输出:
输入消息:测试
Reader1: 测试
Reader2:测试
作者:测试测试
Reader1: 测试
Reader2:测试测试
作者:
Readers:
我尝试添加一个计数变量,因为我假设在所有 reader 能够打印之前标记编写器,然后它使编写器退出嵌套的 while() writer 并停止打印 readers。
关于使 reader 都打印的任何建议,无论是标志还是某种计数?下面还附上了作者和 reader 循环的屏幕截图。
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;
}
这可能不是你的观察的解释,但你的做法很可疑。
您有多个进程,OS 安排每个进程。
首先,不能保证所有 reader 都会阅读该消息。很有可能一个 reader 完成,将标志设置为 0,然后在另一个 reader 有机会读取数据之前将数据复制回共享内存。
然后是你的 data.count
。它以编写器的局部变量 data
开头。在那里你没有初始化 data.count
所以它有一个不确定的值。在 readers 中,您将其设置为 0,但它将被共享内存中的值(不确定值)覆盖。你先做一个 ++,然后再做一个 -- 然后等待它变成 0。那怎么会变成零呢? reader 可以永远等待。