首页  >  文章  >  后端开发  >  如何正确地将对象引用传递给 C 11 std::thread 函数?

如何正确地将对象引用传递给 C 11 std::thread 函数?

DDD
DDD原创
2024-11-26 11:47:10437浏览

How to Correctly Pass Object References to C  11 std::thread Functions?

将对象引用传递给线程函数

使用 C 11 std::thread 接口时,尝试传递对象引用时可能会遇到问题对象引用作为线程函数的参数。即使传递简单整数时也会出现此问题,如以下代码所示:

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

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

此代码按预期编译和执行,但传递 std::ostream 引用会导致编译错误:

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));

通过使用 std::ref,您可以将引用传递给线程函数,从而可以直接操作所传递的目的。但是,确保引用的对象在线程执行期间保持活动状态至关重要。

以上是如何正确地将对象引用传递给 C 11 std::thread 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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