我正在尝试使用pthreads
在C中实现一个多线程程序,并希望在线程之间发送消息。
在线阅读时,我遇到了两种方法。
一个是posix队列,它使用mq_receive
,mq_send
和另一种方法msgrcv
,msgsnd
等功能。
我还注意到在mq_send中,我们只能发送字符串而不是自定义数据结构。有没有办法使用mq_send或替代函数发送不同的数据结构?
哪种方法最好?在哪种情况下最好使用这些功能?
答案 0 :(得分:5)
POSIX:
mq_send
和mq_receive
是POSIX。 POSIX消息队列与System V现代,简单和轻便进行比较。它具有简单的I / O功能,您只能发送和接收字节。在POSIX中,您可以优先发送数据。读取功能很简单,您只能读取下一个数据。在这种情况下,System V可以做更多的事情。
但是,您也可以使用POSIX消息队列发送复杂的结构。你必须使用工会。
struct mydata {
int i;
long x;
// whatever you want
};
union myunion {
struct mydata;
char bytes[sizeof(mydata)];
};
现在您只需要以这种方式发送数据:
myunion u;
u.mydata = // struct to send
mq_send(... &u.bytes .....); // access byte sequence of struct
系统V: System V消息队列要复杂得多。可以发送复杂的结构并以优先级发送它。可以配置接收器,以便仅接收具有一个所选优先级的消息或按优先级排序的所有消息。它有更多的功能。
我更喜欢POSIX,因为它简单易用。使用POSIX,您还可以使用mq_notify
注册通知。如果有消息并且您不需要进行轮询,则会收到事件。在System V中,您不能这样做。
答案 1 :(得分:1)
来自http://linux.die.net/man/7/mq_overview:
System V消息队列(msgget(2),msgsnd(2),msgrcv(2)等)是用于在进程之间交换消息的旧API。 POSIX消息队列提供比System V消息队列更好的设计接口;另一方面,POSIX消息队列的可用性较低(特别是在旧系统上),而不是System V消息队列。 Linux目前(2.6.26)不支持使用POSIX消息队列的访问控制列表(ACL)。
所以这取决于你对旧系统的可移植性的重视程度,我猜?