我是线程的新手,请给我建议。我有将消息广播到客户端的服务器。然后,客户端将答复发送回服务器。我想使用单独的线程处理每个答复。每个答复将具有消息ID和线程ID。如何从所有线程中使用此信息填充某些结构,然后读取它
同样从我的代码中,是否可以在一段时间内正确创建线程,或者即使我得到客户端的答复,它是否也存在于创建线程中?
我是从正确的理解开始的吗?
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 }
谢谢
r ..不,只需创建一个线程,一次即可,用于在一个套接字上接收数据报。在线程函数中,在while(true)循环中接收数据报。不要让此接收线程终止,也不要创建更多的接收线程。连续创建/终止/销毁线程效率低下,危险,不必要,容易出错,难以调试,因此您应该非常努力地做到这一点。
编辑:
仅一个接收线程-但您不必在那里进行处理。Malloc分配一个64K缓冲区,将数据接收到其中,将缓冲区指针推到生产者-消费者队列上,到达将进行处理的线程池,然后循环回去,因此malloc再次重置该指针并为下一个数据报创建另一个缓冲区。处理完成后,释放池线程中的* buffer。缓冲线程同时运行时,接收线程将迅速返回以等待数据报。
如果您发现数据报的发送速度如此之快以至于处理无法跟上,那么随着队列中堆积越来越多的* buffer,内存使用将不受限制地增长。有几种解决方法。您可以使用有界队列,如果达到其容量,它将阻塞。您可以在启动时创建x缓冲区,并将它们存储在接收线程从中弹出的另一个生产者-消费者“池队列”(而不是malloc)中-然后处理池线程可以将“已用” *缓冲区重新推回池队列以供重用。如果池用完,则接收线程将在池上阻塞,直到返回* buffers。
我更喜欢池缓冲方法,因为它限制了整个系统的内存使用量,避免了连续的malloc / free及其碎片问题等,避免了更复杂的有界队列,更易于调整,(池级别易于更改)运行时),并且更易于监视/调试-我通常使用计时器将池级别(即队列计数)每秒转储一次到显示。
无论哪种情况,数据报都可能丢失,但是,如果系统过载,则数据定期到达的速度快于可能被处理的速度,无论您如何设计,情况都将如此。
一个插座就可以了,那为什么要复杂呢?:)