将对象引用传递给线程函数:了解挑战
在 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中文网其他相关文章!