ConnectNamedPipe() 函数在从作为参数传递给新线程的 Functor 的方法中调用时触发“调试错误!abort()”

问题描述

错误

在 Visual Studio 中执行以下操作会触发“调试错误!abort() 已被调用”:

if(m_handle==INVALID_HANDLE_VALUE) return(false); // no return here,therefore m_handle is valid (?)
if(!m_connected){ // some bool indicating a connection doesn't already exist

    if(ConnectNamedPipe(m_handle,NULL)==0){ // --- Abort() message triggered here ----
        // ...
    }
}

背景

以上代码是 connectClient() 类的 PipeFunctor 方法的一部分,该类重载了函数调用运算符 ();在该重载函数中调用了 connectClient():

void PipeFunctor::operator()() {
    connectClient(); // PipeFunctor::connectClient() called here
    // ... 
}

connectClient() 方法通过传递给线程的函子间接调用,即:

PipeFunctor pipeF();
// ...
std::thread (std::ref(pipeF)); 

假设

connectClient()直接调用时(如下所示),同样的ConnectNamedPipe()语句执行没有调试abort( ) 错误:

PipeFunctor pipeF();
// ...
pipeF.connectClient();

这让我相信是线程执行语句 std::thread (std::ref(pipeF)); 导致了下游问题。

1. 有没有一种方法可以通过向它传递一个包含并随后调用 ConnectNamedPipe() 函数的函子对象来开始一个新线程,而不产生此调试 abort() 错误?

2.解决此问题的最佳方法是什么?

感谢所有建议。

谢谢!

附加信息

m_handle 变量是在调用违规函数 connectClient() 之前从 ConnectNamedPipe()(如下所示)方法中创建的(看似成功)

if(!pipename || *pipename==0) return(false); // no return here. pipeName is a correctly initialized LPTSTR variable

   m_handle = CreateNamedPipe(pipename,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,256*1024,5000,NULL);

   if(m_handle==INVALID_HANDLE_VALUE){ // produces if(false)
      wprintf(L"Creating pipe '%s' failed\n",pipename);
      return(false);
   }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)