【发布时间】:2014-06-27 03:23:12
【问题描述】:
出于某些原因,我想通过管道发送指针(当然,不是跨进程) 例如,一些数据应该在一切完成后被回收,结构的(指针)通过管道发送到回收线程;或者我想将一些结构从一个工作线程发送到另一个工作线程。在示例中,没有线程可以等待。
那么,我可以通过管道发送指针吗?
考虑以下几点:
我使用 O_NONBLOCK 向管道写入 8 个字节(例如指针)。但它的缓冲区只剩下 7 个字节。然后从 write() 调用返回“7”。然后其他线程可能会在更多缓冲区可用后写入另一个 8 个字节。当阅读器线程读取管道时,它会得到一个无效的指针。段错误。
我只发送指向该管道的指针。我读过一些关于管道的文章,我注意到当我写入或读取 8 个字节时,它是一个原子操作。是否确认 (管道的缓冲区大小 % sizeof(void*)) == 0 (或至少在 x86_64 linux 上)?如果是这样,条件(1)会发生吗?
直接发送指针会更快更容易。但是如果不安全的话,我就不得不像UTF-8那样对指针进行编码,或者考虑其他方式。
非常感谢~
【问题讨论】:
-
我发现没关系。谢谢大家。 man 7 pipe: O_NONBLOCK enabled, n
标签: c multithreading pointers pipe