写指向管道的指针,是否有任何严格的别名或双关语类型问题?

时间:2013-05-19 16:42:30

标签: c pointers casting pipe strict-aliasing

我需要在程序中创建许多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就是我想要的。

我的程序有什么问题吗? 特别严格的混叠或双关语类问题? 谢谢!

1 个答案:

答案 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

相关问题