我有一个项目,其中多个编写器(使用多线程)使用一个进程写入,单个读取器(单线程)通过另一个进程读取此写入。作家和读者一直在做同样的事情。 Writer 在每次写入时写入可变数据行,因此我无法使用缓冲区。我想使用内存映射文件或我可以在其中写入的单个文件。
我对同步感到困惑。因为我在 2 个过程中这样做所以不能使用条件变量所以只需要使用信号量。
现在,如果我使用信号量,那么多个作者同时写入,这样它会覆盖另一个作者之前写入的数据,当读者读取时,它将只读取最新的写入,我将丢失所有之前的写入。我希望读者应该读取每一个写入发生.一些延迟是可以接受的。
我也可以尝试将所有内容写入一个文件,然后让线程休眠一段时间,然后在休眠期间读取它们,但这样做可能会丢失一些在休眠期间到达的数据。
知道如何实现吗?任何帮助都很棒。我正在使用 C 和 Linux 平台。所以请建议与 C 和 Linux/Unix 相关。
更新一: 我已经为信号量完成了以下步骤:
semget(key,2,flag) //define 2 semaphore
semctl(semid,0,SETVAL,0) //Initialize value for semaphore 0
semctl(semid,1,SETVAL,0) //Initialize value for semaphore 0
writer_lock(semid) //writer lock
struct sembuf action[2] ;
action[0].sem_num = 0;
action[0].sem_flg = SEM_UNDO;
action[0].sem_op = 0 ;
action[1].sem_num = 1;
action[1].sem_flg = SEM_UNDO;
action[1].sem_op = +1 ;
semop(sem_id,action,2);
release_writer_lock
struct sembuf action[1] ;
action[0].sem_num = 1;
action[0].sem_flg = SEM_UNDO;
action[0].sem_op = -1 ;
semop(sem_id,action,1);
reader_lock(semid)
struct sembuf action[2] ;
action[0].sem_num = 1;
action[0].sem_flg = SEM_UNDO;
action[0].sem_op = 0 ;
action[1].sem_num = 0;
action[1].sem_flg = SEM_UNDO;
action[1].sem_op = +1 ;
semop(sem_id,action,2)
release_reader_lock
struct sembuf action[1] ;
action[0].sem_num = 0;
action[0].sem_flg = SEM_UNDO;
action[0].sem_op = -1 ;
semop(sem_id,action,1);
** writer end***
writer_lock(semid)
/* my work*/
release_writer_lock(semid)
** reader end***
reader_lock(semid)
/* read and clear */
release_reader_lock(semid)
最佳答案
您需要使用一对信号量 - 一个用于阻止读者,直到作者创建了要读取的内容,另一个用于阻止作者,直到读者阅读了现有消息。
将读取信号量初始化为 0,将写入信号量初始化为 1。读取器执行:
sem_wait(&read_sem);
/* Read and remove message */
sem_post(&write_sem);
作者是这样的:
sem_wait(&write_sem);
/* Write message */
sem_post(&read_sem);
关于c - 多进程环境中的多读单写同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921986/