【问题标题】:how to use pipe in a same process (thread safe)如何在同一进程中使用管道(线程安全)
【发布时间】:2020-09-01 23:43:54
【问题描述】:

我正在尝试在同一进程中使用管道:

define MAX_SIZE 200

int read_port;
int send_port;

void init()
{

  int fd[2];

  pipe(fd);

  read_port = fd[0];

  send_port = fd[1];

}

void consume(void* destination) {

//read from pipe and store the content to destination

  read(read_port, destination, MAX_SIZE);

}

void channel_send(void* message) {

   write(send_port,message,MAX_SIZE)

}

将有许多线程要写入管道,但只有 1 个线程要从管道中读取。这段代码是否存在一些潜在问题?程序有时会因为某种原因被阻止,但我不知道出了什么问题。

【问题讨论】:

  • 所有管道都有一个缓冲区,具有特定的大小。任何小于或等于此缓冲区大小的写入都将是原子的。
  • 如果问题发生在多线程时,我们还需要查看线程代码。您可以使用信号量保护写入部分(使其具有原子性,重新评论来自 SPD)
  • @某程序员老兄,小于剩余缓冲区大小,对吧?
  • 您没有提供太多上下文,但我强烈怀疑由socketpair() 创建的数据报本地套接字比面向流的管道更适合您的需求。

标签: c multithreading thread-safety pipe


【解决方案1】:

使用 POSIX 信号量使写操作成为临界区的示例代码

#include <semaphore.h> 
#include <unistd.h> 

sem_t mutex; 

void channel_send(void* message) {
   sem_wait(&mutex);
   write(send_port,message,MAX_SIZE);
   sem_post(&mutex); 
}

这使得write() 命令具有原子性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多