最近做一个local socket(domain socket)服务器,来进行进程间通信,使用线程池管理多个线程与不同的客户端连接...
在设计QUERY_CAPABILITY(能力查询)的时候,犯了一个2B的错误...
现在假设我有两个客户端C1, C2, 服务器S分别启动两个线程T1, T2来处理与他们的通信
此时C1发送命令QUERY_CAPABILITY到T1, T1做的决策是调用线程池实例的方法QueryThreadByCapability, 而在这个方法中会遍历线程对象的std::list, 然后通过list中的子线程对象调用其方法AskForCapability来判断其是否支持此能力, 而AskForCapability方法的实现是通过发送QUERY_CAPABILITY到对应的Client,再收取其反馈...
发现问题了吗?...
还没有?
再给点提示...我的子线程T(n)的线程函数是不停地select+recv...
这个时候...如果我是通过T1调用到T2的AskForCapability方法...那么从C2的反馈,会首先被T2的线程函数截获...这样T1就永远不会有返回值...
OMG...
这完全是一个设计上的2B失误...
现在我准备这么改,在Client连接到Server的时候,就把它的capability发送给Server,在对应的T(n)中保存, 这样比较合理了吧...