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