c++11线程简介

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>。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值