这是一个设计问题。通常,Posix 队列优于任何自定义队列,因为它们经过全面测试,并提供优先级队列等高级功能,这可能是开发的关键。但是,如果我们从INTRA进程通信的角度来分析,如果只是在同一个进程的多个线程共享数据之间使用,那该有多好。一旦识别出发送方和接收方共享相同的地址空间,POSIX 队列是否通过删除不必要的 copy_to_user 和 copy_from_user 来优化其消息传递?
最佳答案
您的队列有两个作用:在线程之间交换数据并同步它们。
显然,您的替代方案是 posix 队列或您自己的队列(使用 pthread 互斥体和用于锁定和同步的条件变量)。
对于进程内通信,交换的数据量并不是真正的问题,因为您总是可以只传输数据的指针(并且约定发送线程是 malloc
-接收线程将在消费后释放
它。
我猜想(但你必须测量)Posix 队列可能会稍微慢一些,因为它们可能涉及每个操作的系统调用。相比之下,pthread 操作涉及系统调用 ( futex(2) ) 仅用于争用(在非阻塞操作的常见情况下,互斥锁不执行系统调用)。
我不确定内核是否可以优化消息传递以避免 copy_to_user
因为它可能不知道什么时候只有一个进程的队列(它无法预测没有其他进程会 mq_open
相同的队列)。
您还可以在流程内部使用管道
(在接收方使用poll
)。
但您确实必须进行基准测试。我不确定这是一个大问题。
关于c - 用于进程内线程通信的posix队列与自定义0复制队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160839/