多线程网络编程中的怪异问题
问题描述:
我编写的是一个消息中间件服务器程序。此服务器的一个测试用例是,一个客户端client1发送消息到服务器中的一个消息队列,其余两个客户端client2和client3从队列中接收消息。服务器中的每个消息,只有被client2和client3都接收后才被删除。
假如,服务器的线程2对应于client2,服务器的线程3对应于client3,线程2从socket缓冲区中取得client2这个名字字符串,然后根据client2从队列中取出需要发送给client2的消息,线程3处理client3也是如此。
需要说明的是,每一个线程都使用各自独立的socket。在程序中使用关键代码段来保证各线程的同步工作。
现在的问题是,在程序运行一段时间( <1s )后,线程2有时候从socket缓冲区中取到的用户名字不是client2,而是client3,从而导致了程序的崩溃。
逐步打印调试信息发现,如果线程2从socket缓冲区取到的不是client2而是client3,那么线程2在进入到delMsg()(此函数用来删除队列中的某个消息),并调用EnterCriticalSection(&m_hMutex)加锁后,线程挂起(可能是时间片到?),在接下来,此线程醒来后,竟然不继续从上次断点执行,而是转执行其他的函数!!
不知道这是什么原因?
附:我使用GetCurrentThreadId()来判断当前由哪个线程执行代码,不知道这个函数获得的线程ID是系统唯一的而且是不随时间改变的吗?
我打印的调试信息如下:
从下面可以看到,本来线程3024是处理client13的,但是在下面有一段竟然处理
client12!!!
Thread ID:#3024:client13进入popTopicMessage()
Thread ID:#3024:指向头节点,此用户接收了一圈回到了头节点
Thread ID:#3024:the msg is:client11 says:hi 2
Thread ID:#3024:client13离开popTopicMessage()--success
Thread ID:#3296:client12进入popTopicMessage()
Thread ID:#3296:指向头节点,此用户接收了一圈回到了头节点
Thread ID:#3296:the msg is:client11 says:hi 2
Thread ID:#3296:client12离开popTopicMessage()--success
-----就是在下面一行,3024竟然处理client13:-----
Thread ID:#3024:client12进入deleteMsg()
Thread ID:#3024:server的用户数:2
Thread ID:#3024:节点的消息为:client11 says:hi 2
Thread ID:#3024:增加后的引用计数为1
Thread ID:#3024:client12离开deleteMsg()--success
Thread ID:#3024:client13进入popTopicMessage()
Thread ID:#3024:the msg is:client11 says:hi 2
Thread ID:#3024:client13离开popTopicMessage()--success
-----这次处理client13是正确的3296,但是程序到此就终止了:-----
Thread ID:#3296:client12进入deleteMsg()
Thread ID:#3296:server的用户数:2

