将对临时/匿名lambda的const引用传递到std :: thread构造函数中是否安全?

code_fodder

接下来是这个问题:可以通过引用传递临时的lambda吗?

我有一个固定的代码段:

// global variable
std::thread worker_thread;

// Template function
template <typename Functor>
void start_work(const Functor &worker_fn)  // lambda passed by const ref
{
    worker_thread = std::thread([&](){
        worker_fn();
    });
}

这样称呼:

void do_work(int value)
{
    printf("Hello from worker\r\n");
}

int main()
{
    // This lambda is a temporary variable...
    start_work([](int value){ do_work(value) });
}

这似乎可行,但是我担心传递一个临时的lambda到线程构造函数中,因为线程将运行,但是函数start_work()将返回,而temp-lambda将超出范围。

但是我正在看定义的std :: thread构造函数:

thread()noexcept; (1)(自C ++ 11起)

线程(thread && other)没有例外;(2)(自C ++ 11起)

template <class Function,class ... Args>显式线程(Function && f,Args && ... args); (3)(自C ++ 11起)

thread(const thread&)=删除; (4)(自C ++ 11起)

所以我假设构造函数3被称为:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

我很难理解这里写的内容,但看起来它会尝试移动lambda &&,我认为这对于临时变量是可以的。

那么我在代码片段中所做的操作是危险的(即,引用超出范围)还是正确的(即,温度已移动并且一切都很好)?还是没有?

一种替代方法是只传递我的值(进行复制),这种情况在这种情况下还算不错。

莫尔布德尼洛

确实确实移动了一个临时对象,但它是“内部”对象,是的论点std::thread

该临时文件包含对“外部”临时文件的引用,的参数start_work,并且其生存期在start_work返回之后结束

因此,您的“内部” lambda对象持有对在执行过程中可能存在或不存在的对象的引用,这是非常不安全的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将对象传递给Lambda std :: thread(C ++)中的函数:尝试使用已删除的函数

std :: thread通过引用传递调用复制构造函数

在C#中,对象是否有可能将对自身的引用传递给它在其自己的基本构造函数中创建的子对象的构造函数?

将const函数引用绑定到lambda

构造函数中的const int ref可以安全地绑定到文字吗?

将指向数据成员的指针传递给基类构造函数是否安全?

构造函数中的自引用是否算作“转义”?

guice是否允许将injectMembers集成到构造函数中?

匿名类构造函数中对最终对象的引用是否泄漏?

在可移动类型的构造函数lambda中安全使用捕获的此函数

从 lambda 函数中修改数组是否是 Pythonic/安全的?

在 noexcept 函数体中处理 std::optional 是否安全?

std::thread 是否对其构造函数返回时发生的事情做出任何保证?

使用传递给构造函数的引用可以安全吗-Java

在构造函数中传递

在没有复制构造函数的对象的成员函数中启动 std::thread

通过引用将对象传递给C ++ 11中的std :: thread

在通过值返回并通过const引用传递时避免临时构造

Java-在确保对象引用安全的同时避免将对象引用传递到多个位置

将对象引用传递给构造函数,这是DI吗?

没有参数的std :: thread构造函数

std :: thread构造函数(变量数量)

如果通过引用对象代替函数中的变量,它是否调用复制构造函数?

为什么const引用不能延长通过函数传递的临时对象的寿命?

`std::thread` 对象的构造函数中的 `decay_copy` 有什么作用?

vscode中的C ++:错误:没有匹配的构造函数来初始化'std :: thread'

对于以std :: thread和std :: mutex为字段的类,move构造函数是否有意义?

const引用是否绑定到从临时对象转换为悬挂引用的另一个引用?

std :: vector是否具有引用的副本构造函数?