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