我是新与线程,请你能不能指点我。 我有一个广播消息到客户服务器。 这样,客户端发回的答复服务器。 我想用单独的线程来处理每一个答复。 每一个答复,将有mesage 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
}
谢谢
犯错..没有,只要创建一个线程,只有一次,对一个套接字接收数据报。 在线程功能,接收数据报在一段时间(true)循环。 不要让这个接收线程终止,不产生任何多个接收线程。 不断制造/终端/销毁线程是低效的,危险的,不必要的,容易出错,难以调试,你应该非常努力,不这样做,永远。
编辑:
人们只接收线程 - 但你不必做处理那里。 malloc的一个64K缓冲区,数据接收到它,缓冲区指针推到一个生产者 - 消费者队列的线程会做处理,环回等的malloc再重新安装指针,并创建了一个数据报的另一个缓冲池。 游离在池中的线程的*缓存处理完成之后。 接收线程会很快回来等待数据包而缓存处理并行运行。
如果您发现该数据报能如此迅速的处理跟不上到达,随着越来越多的*缓冲区队列中堆积的内存使用将增长听之任之。 有一对夫妇的方式一轮。 您可以使用如果达到阻止其容量有界队列。 你可以在启动时创建X缓冲区,并将它们存储在另一个生产者 - 消费者“池队列”,从(而不是malloc的),接收线程啪啪 - 那么处理池中的线程可以推动“拿来主义” *缓冲区重新拉回再利用池队列。 如果池耗尽,接收线程将在池阻塞,直到*返回缓冲区。
我宁愿存积缓冲方法,因为它盖在整个系统的内存使用,避免了不断的malloc /免费,其碎片问题等,避免了更复杂的有界队列,比较容易调整,(池级别是很容易的改变运行时),并且是容易监测/调试 - 我通常转储池水平(即队列计数),以显示每秒一次与定时器。
在这两种情况下,数据包可能会丢失,但如果您的系统过载,使得数据有规律地到达速度比它可能被处理,那将是如此反正不管你怎么设计它。
一个插座是好的,为什么事情复杂化? :)