我正在尝试执行此代码。
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链接?
答案 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 ++可能还不能满足这些要求。)