C++的线程不能改变引用参数的值吗

Mr-Luer 2017-12-27 12:41:10
下面程序的输出结果是0,不解,不应该是1吗
void fun(int &a)
{
a =1 ;
}
int main()
{
int a =0 ;
std::thread t(fun,a) ;
t.join () ;
Sleep(1000) ;
cout<<a<<endl ;
return 0 ;
}
...全文
438 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
CT8100 2017-12-27
  • 打赏
  • 举报
回复
把变量类型改成变量的地址或者指针。。。
大风哉 2017-12-27
  • 打赏
  • 举报
回复
参数传到线程里应该是在线程里有一份临时变量参数了吧,fun函数里改变的只是这份临时变量的值。如果传过去的是指针,那么改变的就是最初那个变量了。我觉得你应该看一下关于线程间传值的内容。 另外我这边你能不能帮我看个问题,我想测试下你那个程序,结果编译的时候就报错了: #include <thread> void fun(int& a) { a = 1; } int main() { std::thread t1(fun, 0);//报错的地方 } Error C2672 'std::invoke': no matching overloaded function found CppExperience c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread 240 Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
FoolCarpe 2017-12-27
  • 打赏
  • 举报
回复
试试 std::thread t1(fun, std::ref(a));
xskxzr 2017-12-27
  • 打赏
  • 举报
回复
由于引用的是复制的临时对象,正常的编译器都应该报错。gcc和clang都会报错。 https://wandbox.org/permlink/UISR2IKcmzbB5LWM
xskxzr 2017-12-27
  • 打赏
  • 举报
回复
用std::ref包装a再传给f。 利用std::thread的构造函数传参时,实参会先被复制一次。
大风哉 2017-12-27
  • 打赏
  • 举报
回复
引用 4 楼 qq_33707711 的回复:
你在主函数里变量a没有定义啊,线程t1应该有detach()或者join()至少一个
应该是线程间传值的问题吧,主线程中值传到子线程中,实际在子线程中应该是会创建一个变量的副本,而在子线程函数里修改的是这个副本的内容。 如果这个副本是一个指针的话,通过指针修改的是指针指向的内容。
真相重于对错 2017-12-27
  • 打赏
  • 举报
回复
各线程,有各自的栈
Mr-Luer 2017-12-27
  • 打赏
  • 举报
回复
你在主函数里变量a没有定义啊,线程t1应该有detach()或者join()至少一个
Mr-Luer 2017-12-27
  • 打赏
  • 举报
回复
我知道用指针管用,但这里为什么引用不起作用

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧