【问题标题】:write pointers to pipe, are there any strict aliasing or pun type issues?写指向管道的指针,是否有任何严格的别名或双关语类型问题?
【发布时间】:2013-05-19 16:42:29
【问题描述】:

我需要在一个程序中创建多个FIFO队列,用于同一进程中线程之间的通信。

我想我可以使用 pipe() 来达到这个目的,因为通过这种方式,我可以在从队列中获取节点的线程上使用 select 或 poll。

        int* fd_pipe = (int*)malloc(2*sizeof(int));
        pipe(fd_pipe);

现在的问题是如何将指针放入队列 由于每个节点都是一个结构,我想将指针放入队列中,类似于

类型定义{ 结构包 *pkt; 结构信息*信息; 整数序列; }节点;

  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就是我想要的。

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

【问题讨论】:

  • 你不需要在 C 程序中强制转换 malloc 的返回值。
  • 我更新了我的代码,你的意思是强制转换 `Node* node = (Node*)malloc(sizeof(Node));` 不需要?我的源代码还有其他问题吗?
  • char buf[1000]; 绝对是错误的。这不是混叠违规,而是对齐违规。相反,您应该使用Node buf;
  • 但是我投了(节点*),不是吗?

标签: c pointers casting pipe strict-aliasing


【解决方案1】:

您没有别名问题。这里我看到的唯一问题是read(fd_pipe[0], buf, sizeof(node)),这应该是read(fd_pipe[0], buf, sizeof(Node *))

我不知道你为什么在这里使用字符缓冲区,我更喜欢

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

【讨论】:

  • 我使用的是C而不是c++,我想经常使用select/poll来轮询队列,内存中的队列似乎不适应这种情况?
  • 看不懂你说的灰色地带,在哪里?
  • 我需要在 fd_pipe[0] 上使用 select/poll,为什么需要阻塞 I/O?什么是短读/写。从这个链接stackoverflow.com/questions/1712616/… ,在我看来read/write 不是原子的,应该使用互斥锁锁定?
  • 如果你的意思是“经常”,那么我肯定会使用内存队列。我使用管道的唯一情况是您需要选择/轮询其他对象。我错过了你说你正在使用 select/poll 的句子,所以在这种情况下,你是对的,你不需要阻塞 i/o。我提到的灰色区域是您需要确保完成某种形式的同步,以便在调用 write 之前从管道读取的线程将看到您设置的节点。它是通过内存屏障完成的。在这里你没有任何东西,但由于你在做系统调用,内核会发出一些障碍
  • 写通常不是原子的,你是对的。但是,写入/写入小于 PIPE_BUF 字节的管道 fd 是原子的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多