c - 我可以在同一进程中通过管道发送指针吗,安全吗?

标签 c multithreading pointers pipe

由于某些原因,我想通过管道发送指针(当然,不是跨进程) 例如,一些数据应该在一切完成后被回收,( )结构的(指针)通过管道发送到回收线程;或者我想将一些结构从一个工作线程发送到另一个工作线程。在示例中,没有线程可以等待。

那么,我可以通过管道发送指针吗?

考虑以下事项:

  1. 我使用 O_NONBLOCK 将 8 个字节(例如指针)写入管道。但它的缓冲区只剩下 7 个字节。然后从 write() 调用返回“7”。然后其他线程可能会在更多缓冲区可用后写入 8 个字节。当读取器线程读取管道时,它会得到一个无效指针。段错误。

  2. 我只发送指向此管道的指针。我读过一些关于管道的文章,我注意到当我写入或读取 8 个字节时,这是一个原子操作。是否确认 (buffer size of a pipe % sizeof(void*)) == 0 (或至少在 x86_64 linux 上)?如果是这样,条件 (1) 会发生吗?

直接发指点会更快更方便。但如果不安全,我将不得不像 UTF-8 那样对指针进行编码,或者考虑其他方式。

非常感谢~

最佳答案

只要您确保在将缓冲区转换为指针之前接收到 8 个字节,我就看不出这有什么技术上的问题。进行任何编码都是没有意义的。

但是,当然还有其他更好的方法可以在线程之间传递指针。请注意,使用管道需要为每个 readwrite 进行系统调用(转换到内核模式)。

例如在共享内存中实现一个队列:

A futex(2)将允许您围绕数据结构实现快速用户空间锁定(futex 的定义!)。

关于c - 我可以在同一进程中通过管道发送指针吗,安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443443/

相关文章:

c - 当我使用 const 作为指针时,我收到不兼容的指针类型警告

c - 节点插入、链表

c++ - 如果我删除 C++ 中的指针,将会删除什么

c - 如何使用指向结构的指针进行迭代?

.net - 不可变对象(immutable对象)的线程安全性如何?

multithreading - 线程最佳实践

c - 为什么 `execvp` 需要一个 `char *const argv[]` ?

c - 使用 alloc_pages 分配页面是否也分配结构?

c - 声明的 int 上的指针操作数与声明的指针

c++ - 性能随着线程数量的增加而降低(无同步)