gpt4 book ai didi

c - 多线程udp服务器

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:44 24 4
gpt4 key购买 nike

我是线程的新手,如果你能给我建议,请多多指教。我有广播消息的服务器给客户。然后客户端将回复发送回服务器。我想使用处理每个回复单独的线程。每个回复都会有消息 ID 和线程 ID。我怎样才能填充一些结构使用来自所有线程的信息,然后读取它

同样从我的代码来看,在 while 中创建线程是否正确,或者它是否存在于某个地方仅当我收到客户的回复时才创建线程?

我的理解是否正确?

int main(){

while(1){

sendto on broadcast IP
pthread_create(&cln_thread, NULL, msg_processing, (void *) &arg))

}
}

msg_processing () {

recvfrom client msg with id of packet and thread id
how to write those informations and then read them in main when program finish

}

谢谢

最佳答案

错误.. 不,只需创建一个线程,仅一次,用于在一个套接字上接收数据报。在线程函数中,在 while(true) 循环中接收数据报。不要让这个接收线程终止,也不要创建任何更多的接收线程。持续创建/终止/销毁线程效率低下、危险、不必要、容易出错、难以调试,您应该非常努力地永远不要这样做。

编辑:

只有一个接收线程 - 但您不必在那里进行处理。 Malloc 一个 64K 缓冲区,将数据接收到其中,将缓冲区指针插入生产者-消费者队列到将执行处理的线程池,循环返回,因此 malloc 再次重新设置指针并为下一个数据报创建另一个缓冲区。处理完成后释放池线程中的*缓冲区。当缓冲区处理并发运行时,接收线程将快速返回等待数据报。

如果您发现数据报到达的速度如此之快以至于处理跟不上,随着越来越多的*缓冲区堆积在队列中,内存使用将不受控制地增长。有几种方法可以解决这个问题。您可以使用有界队列,该队列在达到其容量时阻塞。您可以在启动时创建 x 个缓冲区,并将它们存储在接收线程从中弹出的另一个生产者-消费者“池队列”中(而不是 malloc)——处理池线程然后可以将“已用”*缓冲区推回到池队列以供重用。如果池用完,接收线程将阻塞在池上,直到 *buffers 返回。

我更喜欢池缓冲区方法,因为它限制了整个系统的内存使用,避免了连续的 malloc/free 及其碎片问题等,避免了更复杂的有界队列,更容易调整,(池级别很容易在运行时更改),并且更易于监控/调试 - 我通常使用计时器每秒将池级别(即队列计数)转储到显示器上。

在任何一种情况下,数据报都可能会丢失,但是,如果您的系统过载,以至于数据经常到达的速度超过了它可能被处理的速度,那么无论您如何设计它,都会出现这种情况。

一个 socket 就可以了,为什么要复杂化呢? :)

关于c - 多线程udp服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485181/

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