关闭

C++ 11 多线程编程--线程的创建

79人阅读 评论(0) 收藏 举报
分类:
1 通过函数指针创建线程
#include<thread>
void counter(int id,int numIterations)
{
  for(int i=0;i<numIetrations;++i)
  {
    cout<<"Counter"<<id<<"has value";
    cout<<i<<endl;
  }
}

std::thread t1(counter,1,6);
 thread 类的构造函数是一个可变参模板,也就是是说可以接受任意数目的参数。优于 windows 上的CreateThread(),_beginThread() 。pthreads 库中的pthread_create() 函数 这些函数都要求线程函数只有一个参数。
2通过函数对象创建线程
#include "stdafx.h"
#include<thread>
#include<iostream>

//Counter 类->函数对象
class Counter
{
protected:
     int mId;
     int mNumIterations;
public:
     Counter(int id, int numIterations) :mId(id), mNumIterations(numIterations) {}
     ///重载()操作符
     void operator()()const
      {
         for (size_t i = 0; i < mNumIterations; i++)
           {
             std::cout << "Counter " << mId << " has value";
             std::cout << i << std::endl;
            }
      }

};

int main()
{
      // 方式1  
      /* */
      Counter c(1, 10);
     
      std::thread T1(c);


      // 方式2如果函数对象构造函数不需要任何参数 则第一种方式不能正常工作 建议采用方式3 C++11的统一初始化语法
      // Counter(){}; 构造函数不含参数
      // std::thread T2(Counter()); 将导致编译错误,C++会将std::thread T2(Counter()) 解释为函数声明
      std::thread T2(Counter(2, 5));

      // 方式3 使用{} 而非()
      std::thread T3{ Counter(3, 5) };


      T1.join();
      T2.join();
      T3.jion();

      return 0;
}
/*可能的运行结果*/
/*
Counter 1 has value0
Counter 3 has value0
Counter 2 has value0
Counter 3 has value1
Counter 3 has value2
Counter 3 has value3
Counter 2 has value1
Counter 2 has value2
Counter 1 has value1
Counter 1 has value2
Counter 3 has value4
Counter 1 has value3
Counter 2 has value3
Counter 1 has value4
Counter 2 has value4
Counter 1 has value5
Counter 1 has value6
Counter 1 has value7
Counter 1 has value8
Counter 1 has value9
*/
通过lambda 创建线程
#include "stdafx.h"
#include <thread>
#include<iostream>

int main()
{
      std::thread t1(
             [](int id, int numIterations)
              {
                   for (size_t i = 0; i < numIterations; i++)
                    {
                      std::cout << "Counter " << id << " has value";
                      std::cout << i << std::endl;
                    }
               }, 1, 5
                     );
       t1.join();
       return 0;
}
/*运行结果*/
//Counter 1 has value0
//Counter 1 has value1
//Counter 1 has value2
//Counter 1 has value3
//Counter 1 has value4
4 通过成员函数创建
#include "stdafx.h"
#include<thread>
#include<iostream>
// Request 类
class Request
{
  protected:
      int mId;
  public:
      Request(int id) :mId(id) {}
      void process()
      {
        std::cout << "Processing request " << mId << std::endl;
      }
};

int main()
{
     Request request(100);
     std::thread t(&Request::process, &request);
     t.join();
     return 0;
}
可以在不同的对象中执行某个对象的一个方法。如果有其他线程访问同一个对象,需要确认这种访问时线程安全的,以避免竞争条件。
该如何处理这个线程的结束?
       一种方式是等待这个线程结束,在一个合适的地方调用 thread 实例的 join() 方法,调用者线程将会一直等待着目标线程的结束,当目标线程结束之后调用者线程继续运行;另一个方式是将这个线程分离,由其自己结束,通过调用 thread 实       例的 detach() 方法将目标线程置于分离模式。一个线程的 join() 方法与 detach() 方法只能调用一次,不能在调用了 join() 之后又调用 detach(),也不能在调用 detach() 之后又调用 join(),在调用了 join() 或者 detach() 之后,该线程的 id 即被置为默认值(空线程),表示不能继续再对该线程作修改变化。如果没有调用 join() 或者 detach(),那么,在析构的时候,该线程实例将会调用 std::terminate(),这会导致整个进程退出,所以,如果没有特别需要,一般都建议在生成子线程后调用其 join() 方法等待其退出,这样子最起码知道这些子线程在什么时候已经确保结束。



0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:789次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档