我有一个处理多个TCP-Connections的资源管理器。这些连接是pthreads。如何管理它以将数据从Ressource Manager发送到所有这些线程?甚至更好:我怎样才能知道我必须发送哪个线程?
例如:我有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);
但如果只有一个线程,则会失败。那我怎么能管理呢?
答案 0 :(得分:1)
如果每个板有一个线程,则命令中不需要“pid” - 您只需要找到指定板的正确线程(或队列或其他)的方法。
您可以保留已读取结构的列表,并在结构中包含电路板ID。还包括传递命令的方法;这可能是一个管道,但您也可以使用某种队列或列表。这样,每个线程使用一个管道(或其他机制)而不是单个共享管道,并且可以通过在前读列表中搜索具有正确板ID的那个,找到每个板的正确管道。只要确保在线程使用互斥锁运行时保护可能被修改的结构的任何部分。
如你所建议的那样使用单个管道的问题是只有一个线程会获得每个命令 - 如果它是错误的,那么太糟糕了;命令消失了。
答案 1 :(得分:0)
答案是肯定的。我会使用它们的列表。但是当PC的速度非常慢时,我可以打开超过1的管道。 2个连接2个连接。