【问题标题】:sending same data to multiple threads over pipes?通过管道将相同的数据发送到多个线程?
【发布时间】:2011-09-20 00:28:58
【问题描述】:

我有一个处理多个 TCP 连接的资源管理器。这些连接是 pthread。如何管理它以将数据从资源管理器发送到所有这些线程?甚至更好:如何确定我必须将这个命令发送到哪个线程?

例如:我有 2 个线程,一个使用 pid 3333,一个使用 pid 4444。用户发送一个任务来对板进行编程(它是管理 FPGA 板的资源管理器)。资源管理器从列表中选择一块板,该 pid 也保存在其中。然后程序命令应该用这个pid发送到线程,或者,我首先想到的,发送到所有线程,线程决定它们是否继续。协议如下:<pid>#<board-id>#<file>

我在 main.c 中打开 2 个管道(用于写入线程和读取线程)并将它们作为参数提供给监听线程 (forthread-struct)。

main.c
// open Pipes to SSL
    int rmsslpipe[2];
    int sslrmpipe[2];
    if (pipe(rmsslpipe) == -1) {
        writelog(LOGERROR, "main: could not create RM-SSL reading pipe");
        exit(1);
    }
    if (pipe(sslrmpipe) == -1) {
        writelog(LOGERROR, "main: could not create RM-SSL reading pipe");
        exit(1);
    }
    int rmtosslserver = rmsslpipe[1];
    int sslservertorm = sslrmpipe[0];

    // start SSL-Server as a pthread
    pthread_t thread;
    forthread* ft = malloc(sizeof(forthread));
    ft->rmtosslserver = rmsslpipe[0];
    ft->sslservertorm = sslrmpipe[1];
    pthread_mutex_t ftmutex;
    pthread_mutex_init(&ftmutex, NULL);
    ft->mutex = ftmutex;

    pthread_create(&thread, NULL, startProgramserver, (void*) ft);

该线程现在侦听新连接,如果有新连接,它会创建一个新线程,并以forthread-struct 作为参数。这个线程是动作发生的地方:)

void* startProgramserver(void* ft) {

int sock, s;

forthread* f = (forthread*) ft;

// open TCP-Socket
sock = tcp_listen();

while(1){
    if((s=accept(sock,0,0))<0) {
        printf("Problem accepting");
        // try again
        sleep(60);
        continue;
    }

    writelog(LOGNOTE, "New SSL-Connection accepted");
    f->socket = s;
    pthread_t thread;
    pthread_create(&thread, NULL, serveClient, (void*) f);
}
exit(0);
}

这个线程现在初始化连接,从客户端获取一些信息,然后等待资源管理器获取新命令。

n=read(f->rmtosslserver, bufw, BUFSIZZ);

但是如果有不止一个线程,这将失败。那我该如何管理呢?

【问题讨论】:

    标签: c multithreading pthreads pipe


    【解决方案1】:

    如果每个板有一个线程,则命令中不需要“pid”——您只需要一种方法来为指定板找到正确的线程(或队列,或其他)。

    您可以保留一个 forthread 结构列表,并在结构中包含板 ID。还包括一种传递命令的方式;这可能是一个管道,但您也可以使用某种队列或列表。这样一来,每个线程使用一个管道(或其他机制)而不是单个共享管道,并且可以通过在 forthread 列表中搜索具有正确板 ID 的管道来为每个板找到正确的管道。只要确保在线程使用互斥锁运行时保护结构中可能被修改的任何部分。

    按照您的建议使用单个管道的问题是只有一个线程会获取每个命令 - 如果它是错误的,那就太糟糕了;命令消失了。

    【讨论】:

    • 不,我不是每个板都有一个线程,我为每台带有多个板的 PC 设置一个线程。所以如果我有 2 个连接,我必须管理大约 20 个板。但是您认为我应该只打开一个以上的管道(在这种情况下为 2 个连接的 2 个),将它们保存在结构中并像这样访问线程?所以在这种情况下,有 2 个连接,我有 4 个管道,1 个用于写入,1 个用于读取。
    • 是的。如果每个线程有多个板,那么您将使用它们的列表而不是结构中的单个板 ID.. 但除此之外它是相同的。虽然我个人会使用某种队列而不是管道。
    【解决方案2】:

    答案是肯定的。我会使用它们的列表。但是,当 PC 的速度非常慢时,我可以打开超过 1 个的管道。 2 个连接为 2 个连接。

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      相关资源
      最近更新 更多