Visual Studio 2012中的c ++ std :: thread问题

时间:2013-03-15 01:45:52

标签: c++ multithreading debugging visual-studio-2012

我正在尝试执行此代码。

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链接?

2 个答案:

答案 0 :(得分:12)

您是否在退出范围之前加入或分离线程?因为你必须这样做。使用线程运行的退出范围将调用terminate。

答案 1 :(得分:0)

请注意,lambdas通常仅在它们出现的complete-expression中使用,并且临时lambda对象将在该complete-expression的末尾被销毁。

我希望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 ++可能还不能满足这些要求。)