C++11线程简介(待续)
c++线程
使用c++线程的基本流程:
#include <thread>//使用线程要包含头文件
#include <iostream>
using namespace std;//thread类在std命名空间下,要注意
//线程执行的代码,可以是一个函数、λ表达式、或者重载了函数调用运算符的类的实例
void fun(string &str,int n){
for(int i=0;i<n;i++){
cout<<str<<endl;
}
}
int main(){
string str1="hello";
string str2="world";
//创建线程
thread t1(fun,std::ref(str1),10000);
thread t2(fun,std::ref(str2),10000);
//合并线程
t1.join();
t2.join();
return 0;
}
说明:
- 创建线程所用到的头文件是<thread>。
- 线程执行时,可以调用函数、拉姆达对象和重载了函数调用运算符的对象。
- 定义一个thread类,构造函数的参数为传入的函数指针或可调用对象,以及传给它的参数。如果传入参数是引用类型,注意要加上std::ref()。
- 线程创建后立即进入就绪状态,等待系统调度执行。在主线程中调用join()方法合并线程,那么主线程会等待创建的线程执行完毕,再执行后面的语句。如果调用detach()方法,那么在创建其他线程后,主线程会继续执行后面的语句。
- 线程创建后,如果没有同步机制,那么多个线程就会并发执行,通过cout语句可以显示这种并发的效果。
- std::this_thread命名空间中定义了一些访问当前线程的函数。get_id()用来获得当前正在执行线程的县城标识符TID。yield()函数使当前线程让出cpu控制权,重新进入就绪队列中。sleep_until(const std::chrono::time_point<Clock,Duration>& abs_time)使当前线程睡眠直到某一时刻abs_time。 sleep_for (const chrono::duration<Rep,Period>& rel_time)使当前线程睡眠一段时间rel_time。
// this_thread::sleep_for example
#include <iostream> // std::cout
#include <iomanip> // std::put_time
#include <thread> // std::this_thread::sleep_until
#include <chrono> // std::chrono::system_clock
#include <ctime> // std::time_t, std::tm, std::localtime, std::mktime
int main()
{
using std::chrono::system_clock;
std::time_t tt = system_clock::to_time_t (system_clock::now());//获得当前时间,并转型为time_t类型
struct std::tm * ptm = std::localtime(&tt);//把tt转换为本地时间
std::cout << "Current time: " << std::put_time(ptm,"%X") << '\n';
std::cout << "Waiting for the next minute to begin...\n";
++ptm->tm_min; ptm->tm_sec=0;
std::this_thread::sleep_until (system_clock::from_time_t (mktime(ptm)));//mktime()将tm类型转换为time_t类型,再调用from_time_t转换为system_clock,调用sleep_until方法使当前线程睡眠直到该时刻
std::cout << std::put_time(ptm,"%X") << " reached!\n";
return 0;
}
//sleep_for的用法
std::this_thread::sleep_for (std::chrono::seconds(1));
std::this_thread::sleep_for (std::chrono::milliseconds(1));
- thread类中还有一些比较常见的方法,如get_id()用来获得线程标识符TID,joinable()检查线程是否是可执行线程,详情请查阅c++文档。
线程互斥
c++的线程互斥机制定义在<mutex>。