c - 多进程环境中的多读单写同步?

标签 c linux multithreading synchronization

我有一个项目,其中多个编写器(使用多线程)使用一个进程写入,单个读取器(单线程)通过另一个进程读取此写入。作家和读者一直在做同样的事情。 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/

相关文章:

c++ - 我如何让一个进程在 linux 中重新加载自己?

linux - 终止进程 '[avconv] <defunct>'

c - C 程序的内存段

java - Java中的ArrayList和多线程

c - 警告 : implicit declaration of function ‘printf’

c - 在文件中存储 float

c - switch 语句 case '1' 已经在使用 - HandmadeHero 138

windows - 在线程中调用 SHGetFileInfo 以避免 UI 卡住

时间:2019-03-07 标签:c#awaitabletask留在相同的上下文中

c - malloc 导致 SIGSEGV :Segmentation fault