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

原创 2016年08月29日 13:25:35
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() 方法等待其退出,这样子最起码知道这些子线程在什么时候已经确保结束。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【C/C++多线程编程之三】创建pthread线程

多线程编程之创建pthread线程       Pthread是 POSIX threads 的简称,是POSIX的线程标准。           创建线程是多线程编程的第一步,理解线程创建...

C++11 多线程编程《C++ Concurrency in Action》读书笔记(3)-Sharing data between Threads

1.1     Problems with sharingdata between threads When it comes down to it, the problems withsharin...

c++ 11 多线程编程--互斥体类(1)

C++11支持的互斥的形式包括互斥体和锁 (一)互斥体类   ->非定时互斥体类   std::mutex  std::recursive_mutex   ->定时互斥体类   std::time...

C++多线程编程 (三) 线程间通信

七、线程间通讯  一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难...

【C/C++多线程编程之十】pthread线程私有数据

多线程编程之线程私有数据      Pthread是 POSIX threads 的简称,是POSIX的线程标准。         线程同步从互斥量【C/C++多线程编程之六】pt...

【C/C++多线程编程之五】pthread线程深入理解

多线程编程之pthread线程深入理解       Pthread是 POSIX threads 的简称,是POSIX的线程标准。           前几篇博客已经能给你初步的多线程概念,...

C++多线程编程(四)线程的同步

八、线程的同步   虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定...

C++多线程编程(线程类)

简述通过线程类来管理线程,实现业务逻辑与线程管理分离源代码接口类 SFRunnable.hclass SFRunnable { public: virtual ~SFRunna...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)