由于某些原因,我想通过管道发送指针(当然,不是跨进程) 例如,一些数据应该在一切完成后被回收,( )结构的(指针)通过管道发送到回收线程;或者我想将一些结构从一个工作线程发送到另一个工作线程。在示例中,没有线程可以等待。
那么,我可以通过管道发送指针吗?
考虑以下事项:
我使用 O_NONBLOCK 将 8 个字节(例如指针)写入管道。但它的缓冲区只剩下 7 个字节。然后从 write() 调用返回“7”。然后其他线程可能会在更多缓冲区可用后写入 8 个字节。当读取器线程读取管道时,它会得到一个无效指针。段错误。
我只发送指向此管道的指针。我读过一些关于管道的文章,我注意到当我写入或读取 8 个字节时,这是一个原子操作。是否确认 (buffer size of a pipe % sizeof(void*)) == 0 (或至少在 x86_64 linux 上)?如果是这样,条件 (1) 会发生吗?
直接发指点会更快更方便。但如果不安全,我将不得不像 UTF-8 那样对指针进行编码,或者考虑其他方式。
非常感谢~
最佳答案
只要您确保在将缓冲区转换为指针之前接收到 8 个字节,我就看不出这有什么技术上的问题。进行任何编码都是没有意义的。
但是,当然还有其他更好的方法可以在线程之间传递指针。请注意,使用管道需要为每个 read
和 write
进行系统调用(转换到内核模式)。
例如在共享内存中实现一个队列:
A futex(2)
将允许您围绕数据结构实现快速用户空间锁定(futex 的定义!)。
关于c - 我可以在同一进程中通过管道发送指针吗,安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443443/