【问题标题】:boost thread with c++ 11lambda使用 c++ 11lambda 提升线程
【发布时间】:2015-01-22 12:23:57
【问题描述】:

如何在 C++11 lambda 中使用 boost 线程?

以下代码不起作用:

int sum;
m_workerThread=new boost::thread([]()
        {
               for(int i=0;i<100;i++)
               {
                    sum=sum+i;
                }
        }
        );

我收到编译错误。

   Error    4   error C3493: 'sum' cannot be implicitly captured because no default capture mode has been specified 

我该如何解决这个问题?

【问题讨论】:

    标签: c++ multithreading c++11 boost


    【解决方案1】:

    根据错误,只需要捕获sum。照原样,lambda 不知道 sum 是什么:

    m_workerThread = new boost::thread([&sum]()
    //                                  ^^^^
        {
               for(int i=0;i<100;i++)
               {
                    sum=sum+i;
               }
        }
    );
    

    【讨论】:

    • 谢谢。捕获是什么意思,我从其他答案中可以看出 [=],.. 也是可用的,如果我有一个类并且有几个变量怎么办?
    • @mans [=] 表示按值隐式捕获所有变量,此处不正确,因为您需要按引用捕获。为此,[&amp;] 意味着通过引用隐式捕获所有变量。但具体一点总是好的。
    • 谢谢。我是否正确地相信 [&] 意味着 lambda 之外的 sum 是更新, [=] 意味着 sum 的值在开始时被捕获但没有更新(就像将 sum 传递给函数一样)。我们还有其他选择吗?
    • @mans 你会发现[=] 在这种情况下无论如何都不会编译(感谢你!),因为 lambdas 上的operator() 默认为const。但是,如果您明确地创建了 lambda mutable,那么是的,它会在开始时被捕获但不会更新。 C++11 中只有两个选项(值和引用),但 C++14 允许广义 lambda 捕获。谷歌一下,太长了,无法在评论中解释,而且有完整的答案。
    • @mans:请注意,对于不在本地使用的 lambda(线程,还有函数返回的 lambda),通过引用捕获局部变量可能很危险,因为当函数结束时线程仍然存在。线程在函数内部加入就没有问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多