赞
踩
在C++11以前,如果要使用多线程,就需要使用各平台的多线程库,例如,Linux上可以使用pthread,windows上可以使用win32或者MFC提供的多线程API,也就是说,如果要使用多线程,就必须与平台绑定,那么程序就不具备跨平台的能力,为了让程序更好的运行在各平台而不需要用大量的宏来控制编译选项,C++11提供了对多线程的支持,提供了std::thread类。
从线程的使用流程上,线程必然存在以下操作:
因此,一个简单的使用std::thread进行线程编程的代码如下:
#include <iostream> #include <thread> #include <atomic> #include <unistd.h> std::atomic<bool> exit_flag(false); void func() { while(!exit_flag) { std::cout << std::this_thread::get_id() << std::endl; sleep(1); } } int main() { std::thread th(func); sleep(3); exit_flag = true; th.join(); }
这里面的关键点是:
首先还是需要提到线程创建。前面在创建线程时,给的参数是个函数,但是从代码执行角度来说,任何可以执行
的元素都可以放到这里,例如:
不过在实际开发过程中,一般不会使用Lambda表达式、函数对象,使用函数和成员函数居多。
而且,既然是函数,是可以传递参数的,也就是说,在创建线程时,可以给执行的线程的方法传递参数:
#include <iostream>
#include <thread>
#include <unistd.h>
void func(int cnt) {
while(cnt--) {
std::cout << std::this_thread::get_id() << std::endl;
sleep(1);
}
}
int main() {
std::thread th(func, 3);
th.join();
}
这里去掉了线程退出的标志,而是给func函数传递一个参数,用于控制while循环执行的次数。
std::thread除了提供创建和等待退出的方法外,还提供了其他功能:
std::thread th=std::thread(func)
,而不能用std::thread th=th2
这些方案里面比较不好理解的是joinable和detach,而这两个函数刚好是有关联的。
可以将线程理解为前台线程和后台线程,默认创建的线程是前台线程,此时线程对象执行joinable()时返回true,且可以对线程对象执行join(),当线程对象执行detach()后,线程变为后台线程,此时线程对象执行joinable()时返回false,此时不能执行join(),如果对后台线程执行join()会抛出std::system_error异常。
因此,如果不需要等待线程结束或者不关心线程后续执行情况,就可以对线程执行detach(),然后使用变量控制线程的结束;如果需要使用join()等待线程结束,就不能对线程执行detach(),然后结合变量和join()等待线程结束。由于通常需要对线程执行join(),保证在进程退出时线程也正常退出,因此,尽量不对线程对象执行detach()。
std::this_thread是包含一些访问当前线程的函数的namespace,包含以下4个函数:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。