我有一个项目,其中几个编写器(使用多线程)使用一个进程写入,而单个读取器(单线程)通过另一个进程读取此写入。作家和读者一直在做同样的事情。Writer 在每次写入时都会写入可变的数据行,因此我无法使用缓冲区。我想使用我可以写这个的内存映射文件或单个文件。
我对同步感到困惑。由于我在 2 个过程中执行此操作,因此不能使用条件变量,因此只需要使用信号量。
现在,如果我使用信号量,那么几个写入器会同时写入,因此它会覆盖另一个写入器之前写入的数据,当读取器读取时,它将只读取最新的写入,我将丢失所有以前的写入。我希望读取器应该读取发生的每一次写入。有些延迟是可以接受的。
我也可以尝试将一件事全部写入文件,然后让线程休眠一段时间,然后在休眠期间读取它们,但这样做我可能会丢失一些可能在休眠期间到达的数据。
知道如何实现吗?任何帮助都很棒。我正在使用 C 和 Linux 平台。因此,请建议与 C 和 Linux/Unix 相关。
Update1:我已经为信号量完成了以下步骤:
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)