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

ラムダは通常、それらが現れる完全式内でのみ使用され、一時的なラムダ オブジェクトはその完全式の最後で破棄されることに注意してください。

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、ファンクターとすべての引数のコピーを作成する必要があり、ラムダ オブジェクトにはコピー コンストラクターが必要です。ただし、Visual C++ はこれらの要件をまだ満たしていない可能性があります。)

于 2013-03-15T02:21:59.073 に答える