电子商务网站建设的知识点,元做网站,公司网页网站建设 ppt模板,科技类网站源码给定一个线程#xff0c;只要令std::thread对象与之关联#xff0c;就能管控该线程的几乎每个细节。
2.1 线程的基本管控
2.1.1 发起线程
线程通过构建std::thread对象而启动#xff0c;该对象指明线程要运行的任务#xff08;函数#xff09;。简单的任务#xff0c;…给定一个线程只要令std::thread对象与之关联就能管控该线程的几乎每个细节。
2.1 线程的基本管控
2.1.1 发起线程
线程通过构建std::thread对象而启动该对象指明线程要运行的任务函数。简单的任务函数结束返回线程随即终止。复杂的任务情况下函数可以由函数对象表示还接受参数并在运行中经由某种消息系统协调按照指定执行一系列操作。只有收到某指示信号时线程才会停止。
任何函数对象都适用于std::thread。 针对存在二义性的c语句只要它有可能被解释成函数声明编译器就肯定将其解释为函数声明针对这种情况可以采用临时函数对象命名多加一对括号或者采用新的统一初始化语法{ 。。。 }来解决歧义。 std::thread my_thread(background_task())
本意是发起线程background_task是一个重载了括号运算符的类却被解释成了函数声明。函数名my_thread只接受一个参数返回std::thread对象接受的参数是函数指针指针所指向的函数是没有参数输入返回background_task对象。
解决方案
std::thread my_thread((background_task()));
// 或者
std::thread my_thread{background_task()};
也可以使用lambda表达式,它属于可调用对象准许我们编写局部函数能捕获某些局部变量又无需传递参数。
std::thread my_thread([]{do_something();do_something_else();
});
启动线程之后就需要明确等他结束还是任由它独自运行。如果thread对象销毁之际还没决定好thread的析构函数调用std::terminate()终止整个应用程序。
如果选择了detach新线程在主线程结束后子线程就存在外部数据是否合法的问题。解决的方法就是领线程完全自含将数据复制到新线程内部而不是共享外部主线程数据。
2.1.2 等待线程完成
通过与线程关联的std::thread实例上通过调用成员函数join(),控制等待子线程完成。join简单粗暴如果需要更细粒度的控制比如查验线程结束与否或限定只等待一段时间那我们便得改用其他方式如条件变量和future。
2.1.3在出现异常情况下的等待
在std::thread对象被销毁前需要确保已经调用join()或detech()。如果要分离在启动后调用detach即可然而如果打算join就需要挑选位置。因为如果启动后有异常抛出而join尚未执行则该join调用会被略过。一般可以用try-catch来做。以保证新线程在主线程函数退出前终结且一定能够执行到join函数。 2.1.4在后台运行线程
2.2 向线程函数传递参数
2.3 移交线程归属权 附
1. lambda表达式全解
https://www.cnblogs.com/DswCnblog/p/5629165.htmlhttps://www.cnblogs.com/DswCnblog/p/5629165.html2. C中的function和bind
【精选】【C】C11的std::function和std::bind用法详解_c中的std中的方法-CSDN博客
3. 左值右值左值引用右值引用https://www.cnblogs.com/SZxiaochun/p/8017475.html
4. C std::ref————详解-CSDN博客
5. 详解C移动语义std::move()_子木呀的博客-CSDN博客
6. 现代 C 性能飞跃之移动语义 - 知乎