C++11并发学习之二:线程管理
来源:互联网 发布:sql查询字段最大长度 编辑:程序博客网 时间:2024/05/16 01:25
1.启动线程
(1)使用对象
“小试牛刀”中thread构造时传入的是函数,还可以传入对象。
#include <thread>#include <iostream>void func(){ std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl; std::cout<<"Hello Word"<<std::endl;}class MyFunc{public: //重载的函数操作符,对象使用起来就像对象是一个函数一样 void operator()()//无参数无返回值 { func(); }};int main(){ std::cout<<"main thread ID:"<<std::this_thread::get_id()<<std::endl; MyFunc myFunc;//需先定义类的对象 std::thread workerThread(myFunc); workerThread.join(); return 0;}
#include <thread>#include <iostream>#include <string>void func(int i,std::string const &s){ std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl; std::cout<<"Hello Word"<<" "<<s<<" "<<i<<std::endl;}int main(){ std::cout<<"main thread ID:"<<std::this_thread::get_id()<<std::endl; std::string str="at"; //注意这里第二个参数的写法 //为何不直接传str:虽然函数func的第二个参数期待传入一个引用,但是std::thread得构造函数 //并不知晓;构造函数无视函数期待的数据类型,并盲目的拷贝已提供的变量。当线程调用func函数 //时,传递给函数的参数是str变量内部拷贝的引用,而非数据本身的引用。使用std::ref可以解决 //这个问题,将参数转换成引用的形式。 std::thread workerThread(func,20161016,std::ref(str)); workerThread.join(); return 0;}
(3)使用move
#include <thread>#include <iostream>#include <string>void func(int i,std::string const &s){ std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl; std::cout<<"Hello Word"<<" "<<s<<" "<<i<<std::endl;}void func_other(int i,std::string const &s){ std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl; std::cout<<"C++11"<<" "<<s<<" "<<i<<std::endl;}int main(){ std::cout<<"main thread ID:"<<std::this_thread::get_id()<<std::endl; std::string str="at"; std::thread workerThread1(func,20161016,std::ref(str)); std::thread workerThread2=std::move(workerThread1); workerThread1=std::thread(func_other,20161016,std::ref(str)); std::thread workerThread3; std::thread workerThread4; //此句崩溃,workerThread4并未启动// workerThread4.join(); workerThread3=std::move(workerThread2); //此句崩溃,因为workerThread1已经关联一个线程// workerThread1=std::move(workerThread3); workerThread1.join(); //此句崩溃,因为workerThread2没有关联一个线程// workerThread2.join(); workerThread3.join(); return 0;}
#include <thread>#include <iostream>#include <string>#include <chrono>#include <assert.h>void func(int i,std::string const &s){ std::cout<<"worker thread ID:"<<std::this_thread::get_id()<<std::endl; std::cout<<"Hello Word"<<" "<<s<<" "<<i<<std::endl;}int main(){ std::cout<<"main thread ID:"<<std::this_thread::get_id()<<std::endl; std::string str="at"; std::thread workerThread(func,20161016,std::ref(str)); //使用detach()会让线程在后台运行,也就是说主线程不会等待workerThread结束。如果线程detach(), //不可能有std::thread对象能引用它,而且不能再调用该线程的join()方法。 workerThread.detach(); //workerThread.joinable()为false assert(!workerThread.joinable()); //延时10秒,否则然函数func函数还未执行,man函数就退出了 std::this_thread::sleep_for(std::chrono::seconds(10)); return 0;}
2 0
- C++11并发学习之二:线程管理
- .NET组件程序设计之线程、并发管理(二)
- .NET组件程序设计之线程、并发管理(二)
- Java并发之线程管理
- Java并发之线程管理
- Java并发编程之线程管理(Executor框架11)
- java并发编程之线程管理
- java并发之线程封闭(二)
- Java并发之线程池Executors(二)
- Java并发编程之线程(二)
- WCF深入学习_并发管理(二)
- linux C编程学习之线程(二)
- Java并发编程之线程管理(线程创建1)
- C++11并发学习之三:线程同步
- C++11并发学习之四:线程同步(续)
- Java并发学习之二——获取和设置线程信息
- Java多线程与并发学习之(二):创建线程的方式
- 线程并发处理之lock学习
- SQL语句中的各种子句详解
- ADSL业务
- MySQL 列类型-日期时间型
- Struts2标签: 三种给<s:a>,<a>标签传值的方式
- el表达式基础
- C++11并发学习之二:线程管理
- Python在Windows下实现文件备份 脚本程序 版本1
- 草稿测试
- 梦想,从这里启航
- poj 1948 Triangular Pastures (二维背包dp)
- 我好久没有写博客了
- nginx里添加图片分流
- Java IO流系列(补)—— 打印流、序列流、对象流
- Struts2学习资料