在C语言中线程之间的消息传递

7

我想让A线程和B线程进行通信。我应该使用线程间的消息传递来实现这一点,但我正在寻找一些解释消息传递的示例源代码。

有没有人有一些好的链接提供消息传递的示例源代码(用C语言编写)?


1
你能贴一些代码让我们看看吗? - Preet Sangha
使用一些常见的数据结构,通过某种锁进行保护。 - Basile Starynkevitch
消息传递可能意味着信号量或条件变量,你的导师有没有给你任何提示? - IanNorton
  1. 我需要先学习消息传递,所以没有任何源代码。
  2. 我相当确定它是消息传递,但我不完全知道它是如何工作的。
  3. 我认为它是进程间通信的一部分,但没有任何线索。
- Ashish Agarwal
这里有一些使用POSIX和SysV消息队列的示例:http://menehune.opt.wfu.edu/Kokua/More_SGI/007-2478-008/sgi_html/ch06.html - chill
3个回答

13

虽然没有链接,但有许多实现这个的方法。

  • 第一种方法是使用 sockets。我并不推荐这种方法,因为要使它正常工作可能需要很多工作。

  • 第二种方法与第一种方法相关,就是使用称为匿名管道的东西。

  • 第三种方法,也是我通常使用的方法,“灵感”来自于旧的 Amiga 操作系统上的消息传递方式:简单地使用一个 队列。由于内存在线程之间共享,所以只需传递指针即可轻松完成。每个线程使用一个队列。只需记得保护队列,例如使用 互斥锁

  • 你正在使用的平台可能有其他的通信方式,请使用谷歌搜索(例如)linux ipc


@AshishAgarwal 好的,那么请搜索 linux ipc :) - Some programmer dude
1
这是SysV IPC和Unix管道/套接字。 - Kenneth

3
一种非常简单且在Linux上相当快速的方法是使用TCP或UDP套接字在线程之间进行消息传递。 Linux内核相当聪明,如果我没记错的话,它将绕过网络堆栈,使其变得非常快速。 然后您就不必担心锁定和其他各种问题,这些问题基本上由内核处理。 对于作业任务来说应该足够好了。
Uri的TCP/IP资源列表 有关TCP/IP的常见问题解答,教程,指南,网页和站点以及书籍。

为什么要踩这个回答呢?尤其是因为被接受的答案提到了套接字作为一种可能的解决方案。 - Robert S. Barnes

1

进程中的每个线程都可以看到其他线程的所有内存。如果两个线程持有指向内存中相同位置的指针,则它们都可以访问该位置。

以下是代码但未经测试。

struct MessageQueue
{
    std::queue<std::string> msg_queue;
    pthread_mutex_t mu_queue;
    pthread_cond_t cond;
};

{
    // In a reader thread, far, far away...
    MessageQueue *mq = <a pointer to the same instance that the main thread has>;
    std::string msg = read_a_line_from_irc_or_whatever();
    pthread_mutex_lock(&mq->mu_queue);
    mq->msg_queue.push(msg);
    pthread_mutex_unlock(&mq->mu_queue);
    pthread_cond_signal(&mq->cond);
}

{
    // Main thread
    MessageQueue *mq = <a pointer to the same instance that the main thread has>;

    while(1)
    {
        pthread_mutex_lock(&mq->mu_queue);
        if(!mq->msg_queue.empty())
        {
            std::string s = mq->msg_queue.top();
            mq->msg_queue.pop();
            pthread_mutex_unlock(&mq->mu_queue);
            handle_that_string(s);
        }
        else
        {
            pthread_cond_wait(&mq->cond, &mq->mu_queue)
        }
    }

6
虽然消息队列很好用,但是问题的标签是 "c" ,所以不能使用 std::queue - Some programmer dude
警告:这是一份代码草图。它远远不能编译。需要进行一些组装。 - Jonathan Ben-Avraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接