mq_send和msgsnd之间的区别

use*_*342 3 c pthreads message-queue

我正在尝试使用C实现一个多线程程序,pthreads并希望在线程之间发送消息。

在网上阅读时,我遇到了两种方法。

一个是posix Queues,它使用的功能,例如和mq_receivemq_send另一种方法msgrcvmsgsnd

我在mq_send中也注意到,我们只能发送字符串,而不能发送自定义的数据结构。有没有一种方法可以使用mq_send或替代函数发送不同的数据结构?

最好使用哪种方法?在哪种情况下最好使用这些功能?

cod*_*key 5

POSIX: mq_sendmq_receive是POSIX。将POSIX消息队列与System V的现代,简单和轻巧进行了比较。它具有简单的I / O功能,您只能发送和接收字节。在POSIX中,您可以优先发送数据。读取功能很简单,您只能读取下一个数据。在这种情况下,系统V可以做更多的事情。

但是,您也可以使用POSIX消息队列发送复杂的结构。您必须使用工会。

struct mydata {
    int i;
    long x;
    // whatever you want
};

union myunion {
    struct mydata;
    char bytes[sizeof(mydata)];
};
Run Code Online (Sandbox Code Playgroud)

现在,您只需要以这种方式发送数据:

myunion u;
u.mydata = // struct to send
mq_send(... &u.bytes .....); // access byte sequence of struct
Run Code Online (Sandbox Code Playgroud)

系统V:系统V消息队列要复杂得多。可以发送复杂的结构并优先发送。可以对接收器进行配置,以便仅接收具有一个选定优先级的消息或按优先级排序的所有消息。它具有更多功能。

我更喜欢POSIX,因为它简单易用。使用POSIX,您还可以使用来注册通知mq_notify。如果有消息可用,您将在此处收到事件,而无需进行轮询。在系统V中,您不能执行此操作。