C++ 如何将数据传递给C++;将在不同线程中运行的0x lambda函数?

C++ 如何将数据传递给C++;将在不同线程中运行的0x lambda函数?,c++,lambda,c++11,C++,Lambda,C++11,重要更新:显然,当我问这个问题时,我得出了错误的结论。感谢这些响应,我发现lambda函数[=]()在多线程场景中工作得很好。我很抱歉提出了这个令人困惑的问题。请投票结束,因为这不是问题 在我们公司,我们编写了一个库函数,在单独的线程中异步调用函数。它使用继承和模板魔术的结合。客户端代码如下所示: DemoThread thread; std::string stringToPassByValue = "The string to pass by value"; AsyncCall(threa

重要更新:显然,当我问这个问题时,我得出了错误的结论。感谢这些响应,我发现lambda函数
[=]()
在多线程场景中工作得很好。我很抱歉提出了这个令人困惑的问题。请投票结束,因为这不是问题


在我们公司,我们编写了一个库函数,在单独的线程中异步调用函数。它使用继承和模板魔术的结合。客户端代码如下所示:

DemoThread thread;
std::string stringToPassByValue = "The string to pass by value";
AsyncCall(thread, &DemoThread::SomeFunction, stringToPassByValue);
自从引入lambda函数以来,我希望将其与lambda函数结合使用。我想编写以下客户端代码:

DemoThread thread;
std::string stringToPassByValue = "The string to pass by value";
AsyncCall(thread, [=]()
{
    const std::string someCopy = stringToPassByValue;
});
更新:与我最初提出这个问题时的想法相反,这段代码工作得很好

现在,用Visual C++ 2010这个代码不起作用。发生的情况是未复制
stringToPassByValue
。相反,“按值捕获”功能通过引用传递数据。结果是,如果函数在
stringToPassByValue
超出范围后执行,则应用程序将崩溃,因为其析构函数已被调用

所以我想知道:是否有可能将数据作为副本传递给lambda函数

注意:一种可能的解决方案是修改我们的框架以传递lambda参数声明列表中的数据,如下所示:

DemoThread thread;
std::string stringToPassByValue = "The string to pass by value";
AsyncCall(thread, [=](const std::string stringPassedByValue)
{
    const std::string someCopy = stringPassedByValue;
}
, stringToPassByValue);
然而,这个解决方案过于冗长,以至于我们最初的函数指针解决方案更短,更易于阅读


更新:AsyncCall的完整实现太大,无法在此处发布。简而言之,
AsyncCall
template函数实例化了一个包含lambda函数的模板类。该类派生自一个基类,该基类包含一个虚拟的
Execute()
函数,在调用
AsyncCall()
时,函数调用类被放入调用队列中。然后,另一个线程通过调用virtual
Execute()
函数来执行排队调用,该函数以多态方式分派给模板类,然后执行lambda函数。

听起来像是某个bug:
[=]
被定义为通过复制捕获。您确定在实际代码中,stringToPassByValue是
std::string
,而不是指针吗?另外,
AsyncCall
是如何定义的?除非它是一个模板,否则我不知道如何传递lambda,因为它们的类型很有趣。@Steve Jessop:我100%确定它不是指针。你是正确的,因为这看起来像VisualC++编译器中的一个bug,但它也可能是它从来没有打算在多线程的情况下使用,或者它是另一个。alternative@SteveJessop:我添加了一个更新,其中解释了AsyncCall函数是如何实现的。@Dimitri:如果不使用线程,它能工作吗?