c/c++语言开发共享c/c++ 多线程 参数传递

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


多线程 参数传递

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); }  

c/c++ 学习互助qq群:877684253

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

本人微信:xiaoshitou5854

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606614.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐