首页 >后端开发 >C++ >为什么将对象引用传递给 C 线程会导致编译错误?

为什么将对象引用传递给 C 线程会导致编译错误?

Linda Hamilton
Linda Hamilton原创
2024-12-03 12:10:16616浏览

Why Does Passing Object References to C   Threads Cause Compilation Errors?

将对象引用传递给线程函数:了解挑战

在 C 的 std::thread 接口中,将对象引用参数传递给线程函数可能会遇到编译错误。本文探讨了这些错误的根本原因并提供了解决方案。

了解对象引用传递

在提供的示例中,可以将整数 (k) 传递给线程函数如下:

void foo(int &i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

但是,尝试将 ostream 引用传递给线程函数会导致编译error:

void foo(std::ostream &os) {
    // Do something with os
    os << "This should be printed to os" << std::endl;
}

std::thread t(foo, std::cout);

已删除的构造函数

编译错误的根源在于 std::thread 有一个已删除的构造函数,它阻止了直接对象引用传递。这是故意的,因为线程应该复制它们的参数以避免竞争条件。

解决方案: std::ref

要显式传递对象引用,请将其包装为std::ref (或 std::cref 用于常量引用)。此解决方案确保将引用的副本传递给线程函数,从而确保安全:

std::thread t(foo, std::ref(std::cout));

保留对象生命周期

需要注意的是,引用包装器仅包含对该对象的引用。因此,必须确保对象在线程执行过程中保持活动状态。如果不这样做将导致未定义的行为。

以上是为什么将对象引用传递给 C 线程会导致编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn