• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c/c++多线程参数传递

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

多线程 参数传递

1,值传递,拷贝一份新的给新的线程。线程1中有个int变量a,在线程1中启动线程2,参数是a的值,这时就会拷贝a,线程1和线程2不共享a。

2,引用传递,不拷贝一份新的给新的线程。线程1中有个int变量a,在线程1中启动线程2,参数是a的引用,这时就不会拷贝a,线程1和线程2共享a。※传递参数时,必须明确指出使用std::ref函数,不写std::ref,编译不过。

3,指针传递,浅拷贝原来的指针给新的线程。线程1中有个指向int变量a的指针,在线程1中启动线程2,参数是a的地址,这时就不会拷贝a,只是浅拷贝指向a的指针,线程1和线程2共享a。

4,unique_ptr作为参数传递,必须使用move函数

5,函数的指针作为参数传递

引用传递,指针传递的注意事项:因为线程2里使用的是线程1的变量a,所以如果线程1比线程2提前结束了,结束的同时就会释放变量a的内存空间,可是这时线程2还没结束,再去访问线程1中的变量a的话,就会发生意想不到的错误!!!

2,引用传递,例子:

一共3个线程,main函数是一个线程,在main函数里启动了线程2(f1函数),在线程2(f1函数)里启动了线程3(f2函数)。

#include <iostream>
#include <thread>
#include <string>
#include <unistd.h>

using namespace std;

void f2(int& i){
  cout << "f2:" << i << endl;
}
void f1(int& i){
  cout << "f1:" << i << endl;
  int j = 11;
  thread t(f2, ref(j));//-------------->②
  t.detach();
}
int main(){
  int i = 10;
  thread t(f1, ref(i));
  t.detach();//-------------->①
  pthread_exit(NULL);
}

执行结果:

f1:10
f2:0

执行结果分析:

  • 打印出【f1:10】的原因可能是,①处分离线程后,main函数所在的线程还没有结束,所以i还没有被释放掉,所以能打印出10;还有可能是main函数所在的线程虽然已经结束了,但是巧合的是值还是10。
  • 打印出【f2:0】的原因是,②处分离线程后,线程f1已经结束了,所以函数f1里的j已经被释放了,这时线程f2再访问j的时候就是0了。

3,指针传递,例子:

一共3个线程,main函数是一个线程,在main函数里启动了线程2(f1函数),在线程2(f1函数)里启动了线程3(f2函数)。

#include <iostream>
#include <thread>
#include <string>
#include <unistd.h>

using namespace std;

void f2(int* i){
  cout << "f2:" << *i << endl;
}
void f1(int& i){
  cout << "f1:" << i << endl;
  int j = 11;
  thread t(f2, &j);
  t.detach();//-------------->②
}
int main(){
  int i = 10;
  thread t(f1, ref(i));
  t.detach();//-------------->①
  pthread_exit(NULL);
}

执行结果:

f1:10
f2:0

执行结果分析:

  • 打印出【f1:10】的原因可能是,①处分离线程后,main函数所在的线程还没有结束,所以i还没有被释放掉,所以能打印出10;还有可能是main函数所在的线程虽然已经结束了,但是巧合的是值还是10。
  • 打印出【f2:0】的原因是,②处分离线程后,线程f1已经结束了,所以函数f1里的j已经被释放了,这时线程f2再访问j的时候就是0了。

4,unique_ptr作为参数传递,必须使用move函数

#include <iostream>
#include <thread>
#include <string>
#include <unistd.h>

using namespace std;

void f1(unique_ptr<int> upt){
  cout << *upt << endl;
}

int main(){
  unique_ptr<int> upt(new int(10));
  //必须使用move函数,否则编译不过
  thread t(f1, move(upt));
  t.detach();
  pthread_exit(NULL);
}

5,函数的指针作为参数传递

#include <iostream>
#include <thread>
#include <string>
#include <unistd.h>

using namespace std;

class Test{
public:
  void func(int& i){
    cout << i << endl;
  }
};
int main(){
  Test da;
  int i = 10;
  //&Test::func为对象的方法的指针,&da为对象的指针,ref(i)是方法func的参数
  thread t(&Test::func, &da, ref(i));
  t.detach();
  pthread_exit(NULL);
}


本人微信:xiaoshitou5854


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言与C++语言之间关系发布时间:2022-07-14
下一篇:
C#中字符串前缀@和$发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap