(1)先上代码:

void f(int i,std::string const & s);
std::thread t(f,"hello");

第一个参数是线程函数名,第二个参数是函数的参数。但是注意一点,当提供参数是自动变量的指针时,如:

void fn(int i, std::string const & s);
void opp(int some_param)
{char buffer[1024];sprintf(buffer, "%i", some_param);std::thread t(fn, 3, buffer);t.detach();
}

局部变量buffer的指针传递给新的线程,这需要一个时机,如果线程函数在buffer转换为std::string之前退出,那就不好了,解决办法:

std::thread t(fn, 3,(std::string) buffer);//这样就避免了buffer悬浮指针

(2)还有一种情况,就是对象被复制传递了,但我们想要的是引用,结果变量副本改变了,而变量实际没有改变。

void update_data(widget_id w, widget_data& data);
void opp_again(widget_id w)
{widget_data data;std::thread t(update_data, w, data);display_status();t.join();process_widget_data(data);//data的值并没有改变
}

着其实和函数的参数很一致,我们的解决办法是:

std::thread t(update_data, w, std::ref(data));

(3)线程的所有权转移,std::thread是不可复制的,但是是可移动的movable,也就是可以把线程的所有权转移,但一个线程只能有一个所有权。

void some_function();
void some_other_function();
std::thread t1(some_function);
std::thread t2(std::move(t1));//显示转移所有权
t1 = std::thread(some_other_function); //隐式转移所有权
std::thread t3 = std::move(t2);
t1 = std::move(t3);

当然,我们可以把多个线程放入一个vector里面,便于管理。

Thread函数的参数传递和线程所有权转移(2.2)--std::move()相关推荐

  1. C++11中线程所有权转移分析

    移动特性说明 C++标准库中有很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std::thread都是可移动,但不可拷贝. 移动 ...

  2. 【c++】std::move 所有权转移的使用

    1. std::move用法详细梳理 ref_frames_ = std::move(ref_frames);cur_frames_ = cur_frames; 使用std::move函数的好处是可以 ...

  3. C++线程编程-所有权转移与单次调用

    所有权转移 如果一个锁通过参数传递或者move,或者通过参数返回,会发生锁的所有权转移,这是导致死锁的一个原因,如果不是特别需求,一般不会将锁的所有权转移. 但是,转移锁的所有权有另一个好处,它可以延 ...

  4. c++11仔细地将参数传递给线程std::thread

    要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数. 默认情况下,所有的参数都将复制到新线程的内部存储中. 看一个例子: 给线程传递单个参数 #include < ...

  5. java 方法当参数_如何在Java中将函数作为参数传递?

    如何在Java中将函数作为参数传递? 这个问题在这里已有答案: Java Pass方法作为参数                                     14个答案 是否可以将方法作为参 ...

  6. 可延迟函数、内核微线程以及工作队列

    本文研究多个用于在内核环境当中延迟处理的方法(特别是在 Linux 内核版本 2.6.27.14 当中). 尽管这些方法针对 Linux 内核,但方法背后的理念, 对于系统架构研究具有更广泛的意义.例 ...

  7. 【Boost】boost库中thread多线程详解11——线程的休眠和中断

    boost::thread 中提供一个静态方法 void boost::thread::sleep(system_time const& abs_time); 线程将休眠直到时间超时. sle ...

  8. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为

    Linux pthread 和 java thread 的是 / 非守护线程的行为 pthread_xxx 的函数并没有直接提供设置一个 pthread 为守护线程的 API 而 pthread_at ...

  9. android判断主线程_惊天秘密!从Thread开始,揭露Android线程通讯的诡计和主线程的阴谋...

    背景介绍 我们在Android开发过程中,几乎都离不开线程.但是你对线程的了解有多少呢?它完美运行的背后,究竟隐藏了多少不为人知的秘密呢?线程间互通暗语,传递信息究竟是如何做到的呢?Looper.Ha ...

最新文章

  1. 定义指令时“控制器”,“链接”和“编译”函数之间的区别
  2. ElasticSearch 深入理解 三:集群部署设计
  3. python编程培训-课程:尹会生的Python编程培训课程
  4. Hadoop1.x之hdfs集群搭建
  5. 西门子rwd68温控器说明书_西门子RWD68说明书
  6. 9行代码提高少样本学习泛化能力! ICLR2021 Oral,代码已开源
  7. VBKiller使用说明
  8. MongoDB副本集配置系列二:配置MongoDB副本集
  9. 丁腈橡胶自然老化时间_氙灯老化试验箱和紫外光老化试验箱的区别
  10. 会计计算机实训目的,会计专业实习的目的是什么
  11. global mapper导出影像范围
  12. html5网页制作代码 大学生网页制作作业代码 (旅游网站官网滚动模板)
  13. Unity3D FingerGestures 手势插件使用
  14. BMP图片-文件头部信息
  15. 软件测试周刊(第10期): 大质量
  16. 【cubemx】移植正点原子ov2640
  17. 判断两数互质,java实现
  18. 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析
  19. 小卫星制造行业深入研究
  20. QQ网页微信、QQ二维码登录原理分析(整理)

热门文章

  1. mysql8.0登录不上去怎么回事_速看!智慧团建系统登录平台及信息查询入口
  2. itextpdf html 样式,将HTML解析为PDF的iText样式
  3. php 添加cdata,PHP cdata 处理 PHP cdata 处理(仔细讲解)
  4. 【杂题总汇】HDU-6406 Taotao Picks Apples
  5. 前后端交互之封装Ajax+SpringMVC源码分析
  6. 使用Tensorflow进行脸部识别
  7. Django 找不到模版报错 django.template.exceptions.TemplateDoesNotExist: index.html
  8. 关于uboot中tftp上传内存数据到tftp服务器
  9. DFS分布式文件系统安装部署
  10. mysql 文章 字段设计_在mysql数据库中,文章表设计有啥好的思路