C++多线程编程


1UNIX多线程

1.1 概述

      UNIX多线程是采用面向过程的设计,所有的使用单位都是函数,同时UNIX线程是一个进程内部的一个控制序列,同一个进程内的所有线程都共处同一个地址空间。

1.2 创建

      对于UNIX多线程的使用方式,也非常简单。只需在通过pthread_create函数创建线程时,设置相应的启动函数并传递给启动函数相应参数,当创建完成后线程立即启动。而其它的多线程特性可以参考其它资料。

如下是UNIX多线程的创建实例:

  1. void *pthread_main(void*)
  2. {
  3.      printf("hello,world\n");
  4.      return NULL;
  5. }
  6.  
  7. void thread()
  8. {
  9.      pthread_t pID;
  10.      pthread_create(&pID, NULL, pthread_main, NULL);
  11. }
  12. 输出:
  13.      hello,world

2C++多线程

2.1 概述

      在C++ 98标准中没有语言级别的并发支持,因为在C++诞生很久之后才出现多线程等并发概念。由于UNIX多线程设计是面向过程的概念,而C++主要特性是面向对象,当然C++也可以采用面向过程的思想使用UNIX多线程,但这不符合C++的设计思想。

所以本文介绍如何以C++的面向对象思想使用UNIX的多线程设计,从而提高软件设计的效率。

2.2 创建

      在同一个进程中的多线程是处于同一个地址空间内,即只要知道一个线程的地址,就能够在另一个线程中访问该地址的内容,本文即介绍同一个进程中的多线程使用方式。

      C++创建多线程与UNIX创建方式类似,只是指定线程的启动函数和传递参数不同。可以给pthread_create函数传递C++类的静态成员函数和该类的对象指针,因为在不同线程之间的地址是处于同一个地址空间内,所以其他线程也可以访问到。

    从而通过这种方式,在C++类的静态方法中操作本身类的成员或成员函数,即使本身的成员是私有类型,在静态方法中依然能够使用。

如下是使用C++创建多线程的简单实例:

  1. class Thread
  2. {
  3. public:
  4.     static void* mainMethod(void *bt)
  5. {
  6.       Thread *bt = (Thread*)vbt;
  7.       printf("age:%d\n",bt->age);
  8.  
  9.      bt->height = 34;
  10.      printf("height:%d\n",bt->height);
  11.      return vbt;
  12. }
  13. public:
  14.     int age;
  15. private:
  16.     int height;
  17. };
  18.  
  19. void thread() //其他函数或类成员方法中创建新的线程
  20. {
  21.       Thread *bt = new Thread();
  22.       bt->age = 23;
  23.  
  24.     pthread_t pt;
  25.     pthread_create(&pt, NULL, Thread::mainMethod, (void*)bt);
  26. }
  27. 输出:
  28.      age:23
  29.      height:34

3boost多线程

3.1 概述

      在boost的多线程使用方式与UNIX的使用方式类似,但boost创建方式只需指定线程启动函数和传递的函数实参,而无需再配置其它参数。一样在创建线程后,立即执行启动函数,不需要调用类似start()、begin()类似的函数。

3.2 创建

      boost的多线程创建方式也是基于面向过程的设计,若按面向对象的思想使用时,可以按C++的使用方式进行创建,即创建线程时传递C++的静态成员函数和该类对象的指针。不同的是在传递和接收时,不需进行类型转换。

  1. class boostThread
  2. {
  3. public:
  4.     static void* mainMethod(boostThread *bt) //不需类型转换
  5. {
  6.         printf("age:%d\n",bt->age);
  7.         bt->height = 34;
  8.         printf("height:%d\n",bt->height);
  9.         return bt;
  10. }
  11. public:
  12.     int age;
  13. private:
  14.     int height;
  15. };
  16. void thread() //其他函数或类成员方法中创建新的线程
  17. {
  18.      Thread *bt = new Thread();
  19.      bt->age = 23;
  20.      thread td(boostThread::mainMethod, bt); //不需类型转换
  21. }
  22. 输出:
  23.       age:23
  24.       height:34

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM