2013-03-15 2 views
2

이 코드를 실행하려고합니다.Visual Studio 2012의 C++ std :: thread 문제

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. 

브레이크 포인트 (Break Point)

  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; 

미리 감사에 의해 ... crt0msg.c 원인입니다 .. 얻는다.

나는 실제로 동일한 프로그램에서 다른 스레드 호출을 실행하려고했지만 운이 없었습니다. 그것은 내 컴파일러 일 수 있습니다. #include를 사용하여 빌드 옵션에서 링크해야하는 라이브러리가 있습니까?

+1

'std :: vector'가 사용되는 이유는 무엇입니까? 'size()'함수가 있습니다. – chris

+0

릴리스 모드에서도 발생합니까? – 4pie0

+0

@ cf16 릴리스 모드에서 시도하지 않았 으면 좋겠지 만 나중에 다시 시도해 볼 수 있습니다. – LightKeep

답변

11

범위를 종료하기 전에 스레드를 결합하거나 분리합니까? 너 때문에해야 해. 호출을 실행중인 스레드가있는 종료 범위는 종료됩니다.

+0

아니요, 저는 선생님이 아닙니다. – LightKeep

+0

함수를 호출 한 후에는 함수에서 다른 작업을 수행하지 않습니다. – LightKeep

+0

이것은 답변이 아닙니다. 의견입니다. – Rapptz

0

람다는 일반적으로 나타나는 완전한 표현식 내에서만 사용되며 임시 람다 객체는 완전 표현식의 끝 부분에서 삭제된다는 점에 유의하십시오.

평생 문제를 피하기 위해 std::thread에서 전달 된 functor 개체의 복사본을 만들 것으로 예상됩니다.

하지만 당신은 어떤 문제를 통해 없다 보장 할 수 있습니다 :

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을 필요로하지 않습니다, 또한 저작권법과를 가지고 람다 객체가 필요합니다 그러나 Visual C++는 아직 이러한 요구 사항을 충족하지 못할 수 있습니다.)

+0

분리를 사용하면 스레드가 BOOL을 반환해도 functionOne으로 전달됩니까? – LightKeep

+0

@LightKeep : 'functionOne'이 아직 작동 중이며 범위를 벗어나지 않은 한, 네. 범위를 벗어나면 나쁜 일이 일어납니다. –