【发布时间】: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