我需要在程序中创建许多FIFO队列,用于同一进程中的线程之间的通信。
我认为我可以为此目的使用pipe(),因为通过这种方式,我可以在从队列中获取节点的线程上使用select或poll。
int* fd_pipe = (int*)malloc(2*sizeof(int));
pipe(fd_pipe);
现在的问题是如何将指针放入队列 因为每个节点都是一个结构,我想把指针放到队列中,比如
的typedef { struct Packet * pkt; struct Info * info; int seq; }节点;
on threads which put node into the queue:
Node* node = (Node*)malloc(sizeof(Node));
Node->info = ...;
Node->seq = ...;
Node->pkt = ...;
write(fd_pipe[1], node, sizeof(node));
on threads which read node from the queue:
char buf[1000];
read(fd_pipe[0], buf, sizeof(node))
Node* mynode = (Node*)buf;
那么mynode就是我想要的。
我的程序有什么问题吗? 特别严格的混叠或双关语类问题? 谢谢!
答案 0 :(得分:2)
您没有别名问题。我看到的唯一问题是read(fd_pipe[0], buf, sizeof(node))
,这应该是read(fd_pipe[0], buf, sizeof(Node *))
。
我不知道为什么你在这里使用char缓冲区,我更喜欢
Node *node;
if (read(fd_pipe[0], &node, sizeof(node)) <= 0) {
// error, deal with it
}
它更简单,更清晰。
现在,只有使用默认的阻止i / o,您的代码才能正常工作。另外,从技术上讲,你应该处理短读/写,但如果读/写大小小于PIPE_BUF(总是比指针大得多),则在管道上写/读是原子的
在写入之前,代码中有一些关于内存同步的灰色区域,但由于这是系统调用,因此它可以正常工作。
管道是线程之间通信的一种不寻常的方式。通常,人们使用内存中的队列来在线程之间进行通信。一个例子是http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html