C++ 将main()中局部变量的引用传递给其他线程/函数是否是一种错误的做法?

C++ 将main()中局部变量的引用传递给其他线程/函数是否是一种错误的做法?,c++,memory,pass-by-reference,C++,Memory,Pass By Reference,考虑以下示例,我在main()中创建了局部变量specialNumber,并通过引用将其传递给一个新线程和另一个函数(请忽略缺少锁/互斥): #包括 #包括 无效螺纹管路(内部和编号){ while(true){ std::this_thread::sleep_for(std::chrono::seconds(2)); std::cout你的假设 我知道通常应该避免传递对局部变量的引用 似乎没有根据 传递对函数的引用没有错。但是,引用对象的函数不应拥有该对象的所有权。函数不应假定被引用对象在退出

考虑以下示例,我在
main()
中创建了局部变量
specialNumber
,并通过引用将其传递给一个新线程和另一个函数(请忽略缺少锁/互斥):

#包括
#包括
无效螺纹管路(内部和编号){
while(true){
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout你的假设

我知道通常应该避免传递对局部变量的引用

似乎没有根据

传递对函数的引用没有错。但是,引用对象的函数不应拥有该对象的所有权。函数不应假定被引用对象在退出后继续存在

这与返回对局部变量的引用不同,后者总是错误的

我认为向线程传递引用没有问题(除了缺少同步),这通常比使用全局变量更可取


智能指针,例如
std::shared_ptr
,仅当函数应采用(共享)时才需要对象的所有权,例如,如果
threadRun
希望在对象退出后保留指向该对象的引用/指针。

只要
主线程处于活动状态,您就不会看到出现问题,因为
特殊编号的生存期由它控制

但是,我想详细介绍一下
std::ref()
的用法。
std::ref()
的用法之一就是您正在编写的场景

当您使用
std::ref()
时,实际上返回的是一个可以复制的
std::reference\u包装。引用包装可以存储在容器中,而普通引用不能

通过引用将对象传递给线程的构造函数是引用包装器有用的方式之一,
std::ref()
返回引用包装器

如果您传递一个简单的引用,您将看到不同的行为

阅读更多关于和


此线程也很有帮助。

您需要同步以避免数据竞争,但这对于传递引用并不特殊,如果您使用智能指针也是一样的。您在这里使用智能指针的方式是错误的做法,因为您没有在线程之间同步对它的访问。您发布的内容与线程安全相反。@KenW我在帖子的顶部写了一句“请忽略缺少锁/互斥锁”。我知道这不是线程安全的,但这不是问题所在。我特别想问的是在主函数中传递对局部变量的引用的做法,您可以假设这个示例是线程安全的。在这种特定情况下,智能指针是过死的(而且对您没有好处)。这是一个(a)问题所有权和(b)生存期。对(a)的回答通常决定(b)的状态。这适用于数据和线程本身。在本例中,(a)是
main()
,并控制(b)对于线程和传递的数据,引用就足够了。你更大的问题是与共享数据的同步完全不充分。但这似乎不是你的问题。你是对的,我肯定对返回对局部变量的引用和将它们传递给其他函数感到困惑。非常感谢很
#include <iostream>
#include <thread>

void threadRun(int& number) {
    while(true) {
        std::this_thread::sleep_for(std::chrono::seconds(2));
        std::cout << number << std::endl;
        number += 1;
    }
}

int main() {
    int specialNumber = 5;
    std::thread newThread(threadRun, std::ref(specialNumber));
    otherFunction(specialNumber);
    newThread.join();
}


void otherFunction(int& number) {
    // does something with number
}