在使用命名管道时发现一个奇怪的问题,命名管道的每次发送接收都加了锁为什么在通讯时TransactNamedPipe函数会不定时返回错误,且错误码是 231(命名管道忙碌)。
返回错误后再次使用ReadFile可以正确读取数据。
经过多次测试发现这种现象只发生在切换线程时,当多个线程同时使用一个命名管道句柄时,如果多个线程同时使用即便是加锁也会返回231错。
原因尚不明确,可以用GetLastError() 获取错误码,如果是231 重新用 ReadFile 读取即可。
原因找到了,是因为上一个线程没把管道中的消息读完导致的,当管道中还有数据待读时,调用TransactNamedPipe会返回错误,错误码是231。
本文探讨了在使用命名管道进行线程间通讯时遇到的TransactNamedPipe函数返回错误231(命名管道忙碌)的问题。通过实验发现,此错误与线程切换及管道数据未完全读取有关,并提供了GetLastError()的使用方法来检测该错误。
2072

被折叠的 条评论
为什么被折叠?



