gpt4 book ai didi

c - 通过管道将相同的数据发送到多个线程?

转载 作者:行者123 更新时间:2023-11-30 16:00:45 31 4
gpt4 key购买 nike

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

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

但是如果有多个线程,则此操作会失败。那么我该如何管理呢?

最佳答案

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

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

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

关于c - 通过管道将相同的数据发送到多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478847/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com