Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过管道向多个线程发送相同的数据?_C_Multithreading_Pthreads_Pipe - Fatal编程技术网

C 通过管道向多个线程发送相同的数据?

C 通过管道向多个线程发送相同的数据?,c,multithreading,pthreads,pipe,C,Multithreading,Pthreads,Pipe,我有一个ressource管理器,可以处理多个TCP连接。这些连接是pthread。如何管理它将数据从Ressource Manager发送到所有这些线程?或者更好:我如何知道我必须向哪个线程发送这个命令 例如:我有两个线程,一个是pid 3333,一个是pid 4444。用户发送一个任务来编程板(它是一个管理FPGA板的资源管理器)。ressource manager从列表中选择一块板,该pid也保存在列表中。然后程序命令应该被发送到带有这个pid的线程,或者,我首先想到的是,发送到所有线程,

我有一个ressource管理器,可以处理多个TCP连接。这些连接是pthread。如何管理它将数据从Ressource Manager发送到所有这些线程?或者更好:我如何知道我必须向哪个线程发送这个命令

例如:我有两个线程,一个是pid 3333,一个是pid 4444。用户发送一个任务来编程板(它是一个管理FPGA板的资源管理器)。ressource manager从列表中选择一块板,该pid也保存在列表中。然后程序命令应该被发送到带有这个pid的线程,或者,我首先想到的是,发送到所有线程,线程决定它们是否继续。协议如下所示:
##

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

该线程现在侦听新连接,如果有新连接,它将创建一个以
forthread
-struct作为参数的新线程。此线程是操作发生的位置:)


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

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

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


正如您所建议的那样,使用单个管道的问题在于,每个命令只能由一个线程执行——如果是错误的,那就太糟糕了;命令不见了。

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

不,我不是每个板都有一个线程,我有多个板的每台PC都有一个线程。因此,如果我有2个连接,我必须管理大约20块板。但是您认为我应该打开多个管道(在本例中,2个连接2个管道),将它们保存在结构中,然后像这样访问线程?所以在这个有2个连接的例子中,我有4个管道,1个用于写,1个用于读。是的。如果每个线程有多个板,那么可以使用它们的列表,而不是结构中的单个板ID。。但在其他方面都是一样的。虽然我个人喜欢使用某种队列,而不是管道。
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);
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);