3

我正在尝试执行此代码。

BOOL genFunctionOne(std::vector <char> functionOneBuffer, int functionOneCharCount)
{
  int lineCountTest = 0;
  int characterCountTest = 0;

  for (int i = 0; i < functionOneCharCount; i++)
  {
    if (functionOneBuffer[i] == '\n')
      lineCountTest++;

    characterCountTest++;
  }

  return FALSE;     
}

有了这个电话。

std::thread funcThreadOne( [&] { functionOne = genFunctionOne( functionBufferOne, functionCharCountOne ); } );

每次我调用这个函数。我明白了。。

Microsoft Visual C++ Runtime Library

Debug Error!

Program:... my.exe

R6010
-abort() has been called

Please retry to debug the application.

断点是由... crt0msg.c 引起的

            if (rterrnum != _RT_CRNL && rterrnum != _RT_BANNER && rterrnum != _RT_CRT_NOTINIT)
        {
            switch (_CrtDbgReportW(_CRT_ERROR, NULL, 0, NULL, L"%s", error_text))
            {
            case 1: _CrtDbgBreak(); msgshown = 1; break;
            case 0: msgshown = 1; break;

提前致谢。

我实际上已经尝试在同一个程序中运行其他线程调用并且没有运气。它可能是我的编译器,是否有任何库需要在构建选项中与 #include 链接?

4

2 回答 2

13

您在退出范围之前加入或分离线程吗?因为你必须。退出范围与线程运行调用终止。

于 2013-03-15T01:51:34.630 回答
0

请注意,lambda 通常仅在它们出现的完整表达式中使用,并且临时 lambda 对象将在该完整表达式的末尾被销毁。

我希望std::thread复制传入的仿函数对象,以避免生命周期问题。

但是您可以通过以下方式确保没有问题:

auto threadProc =  [&] { functionOne = genFunctionOne( functionBufferOne, functionCharCountOne ); };
std::thread funcThreadOne(threadProc);
funcThreadOne.join(); // <- make sure you do this before threadProc goes out of scope

(注意:标准确实要求std::thread复制仿函数和所有参数,并且还要求 lambda 对象具有复制构造函数。但 Visual C++ 可能还不能满足这些要求。)

于 2013-03-15T02:21:59.073 回答