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++ 11 多线线程系列-----thread

一、与 C++11 多线程相关的头文件 C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是 ,,,和。 :该头文主要声明了两个类, std::atomic 和 std::atomi...
  • chenxun2009
  • chenxun2009
  • 2015年11月11日 20:19
  • 4127

C++11多线程基本使用

C++11增加了线程及线程相关的累,很方便的支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高....
  • wrx1721267632
  • wrx1721267632
  • 2016年08月13日 11:31
  • 3412

c++ 11 多线线程系列-----------使用c++11 lambda创建线程

C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用...
  • chenxun2009
  • chenxun2009
  • 2015年11月19日 00:03
  • 2759

C++11线程指南(1)--创建线程

1. Create Thread #include #include using namespace std; void thread_func() { cout
  • shltsh
  • shltsh
  • 2014年08月05日 21:07
  • 1119

Linux C++的多线程编程(收藏好文)

1. 引言   线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(proc...
  • richerg85
  • richerg85
  • 2014年01月08日 21:39
  • 10362

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

简述通过线程类来管理线程,实现业务逻辑与线程管理分离源代码接口类 SFRunnable.hclass SFRunnable { public: virtual ~SFRunna...
  • csx66406602
  • csx66406602
  • 2017年02月04日 16:06
  • 1325

C++使用thread类多线程编程

C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include #include #include using namespace std; void thread...
  • dcrmg
  • dcrmg
  • 2016年12月28日 20:23
  • 14671

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

多线程编程之创建pthread线程       Pthread是 POSIX threads 的简称,是POSIX的线程标准。           创建线程是多线程编程的第一步,理解线程创建...
  • Jiangweihll
  • Jiangweihll
  • 2014年04月15日 22:42
  • 7716

C++11多线程编程之互斥量

C++11多线程编程之互斥量
  • u012333003
  • u012333003
  • 2014年05月07日 15:55
  • 1154

C++11多线程互斥锁的使用

#include #include #include #include #include #include #include // 参考:http://www.cnblogs.com...
  • u011726005
  • u011726005
  • 2017年10月16日 20:32
  • 175
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 11 多线程编程--线程的创建
举报原因:
原因补充:

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