1. #ifdef WIN32
  2. #include <Windows.h>
  3. #include <process.h>
  4. #else
  5. #include <pthread.h>
  6. #endif
  7. /*
  8. #ifdef WIN32
  9. typedef unsigned int(__stdcall *thread_func)(void*);
  10. #else
  11. typedef void*(*thread_func)(void*);
  12. #endif
  13. */
  14. class base_thread
  15. {
  16. public:
  17. base_thread();
  18. virtual ~base_thread();
  19. bool create();
  20. void wait();
  21. virtual void run() = 0;
  22. #ifdef WIN32
  23. static unsigned __stdcall thread_func(void* arg);
  24. #else
  25. static void* thread_func(void* arg);
  26. #endif
  27. protected:
  28. #ifdef WIN32
  29. HANDLE m_handle;
  30. #else
  31. pthread_t m_thread_t;
  32. #endif
  33. };
  34. #endif
  1. base_thread::base_thread()
  2. {
  3. #ifdef WIN32
  4. m_handle = NULL;
  5. #else
  6. m_thread_t = 0;
  7. #endif
  8. }
  9. base_thread::~base_thread()
  10. {
  11. #ifdef WIN32
  12. if (NULL != m_handle)
  13. {
  14. CloseHandle(m_handle);
  15. }
  16. m_handle = NULL;
  17. #else
  18. m_thread_t = 0;
  19. #endif
  20. }
  21. bool base_thread::create()
  22. {
  23. bool ret = false;
  24. #ifdef WIN32
  25. m_handle = (HANDLE)_beginthreadex(NULL, 0, thread_func, this, 0, NULL);
  26. if (NULL != m_handle)
  27. {
  28. ret = true;
  29. }
  30. #else
  31. if (0 == pthread_create(&m_thread_t, NULL, thread_func, this))
  32. {
  33. ret = true;
  34. }
  35. else
  36. {
  37. m_thread_t = 0;
  38. }
  39. #endif
  40. return ret;
  41. }
  42. void base_thread::wait()
  43. {
  44. #ifdef WIN32
  45. WaitForSingleObject(m_handle, INFINITE);
  46. if (NULL != m_handle)
  47. {
  48. CloseHandle(m_handle);
  49. }
  50. m_handle = NULL;
  51. #else
  52. pthread_join(m_thread_t, NULL);
  53. m_thread_t = 0;
  54. #endif // WIN32
  55. }
  56. #ifdef WIN32
  57. unsigned __stdcall base_thread::thread_func(void* arg)
  58. #else
  59. void* base_thread::thread_func(void* arg)
  60. #endif
  61. {
  62. base_thread *pthis = (base_thread*)arg;
  63. pthis->run();
  64. return NULL;
  65. }

封装了一个线程基类,可以在windows和linux下使用,其中run方法是要求继承的子类必须实现的,这个方法相当于线程函数,可以看到,在基类base_thread中,我在线程函数中调用了方法run。wait是用来等待线程安全退出放在主线程中卡住等待的。

跨平台(win和unix)的线程封装类的更多相关文章

  1. Unix / Linux 线程的实质

    线程与进程的比较 概述: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小 ...

  2. UNIX环境--线程

    一.线程的概念 1.线程在进程中是负责执行代码的一个单位,可以说线程是进程的一部分.一个进程中至少要有一个主线程,进程可以拥有多个线程. 2.线程和进程一样,线程会共享进程的一些信息.比如,代码段.全 ...

  3. 关于协程的学习 & 线程栈默认10M

    先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件 ...

  4. 线程 (detach的作用)

      线程状态在一个线程的生存期内,可以在多种状态之间转换.不同操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状 态还可以包含多个子状态.但大体说来,如下几种状态是通用的:       就 ...

  5. 一个跨平台的 C++ 内存泄漏检测器

    2004 年 3 月 01 日 内存泄漏对于C/C++程序员来说也可以算作是个永恒的话题了吧.在Windows下,MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏.在Linux下, ...

  6. linux文件锁的应用,POSIX,unix标准,linux标准

    1. perl,flock加锁.java也能加锁. 2. 先创建文件并打开,才能加锁(写打开?). 3. 可以用于判断进程是否一直在运行(用另一进程判断),如果锁一直在,则进程在:锁不在,则原进程或意 ...

  7. Thread.start() ,它是怎么让线程启动的呢?

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  8. 面试官:Java 线程如何启动的?

    摘要:Java 的线程创建和启动非常简单,但如果问一个线程是怎么启动起来的往往并不清楚,甚至不知道为什么启动时是调用start(),而不是调用run()方法呢? 本文分享自华为云社区<Threa ...

  9. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

随机推荐

  1. 2019 GIAC-全球互联网架构大会课件

    百度云:https://pan.baidu.com/s/1Lt40UTP3hCIVS7LhPl2bKw密码:ovrh

  2. javascript冒泡事件详解

    冒泡事件: 定义:当多个Dom元素互相嵌套的时候,一个元素触发了某个事件(例如Click事件),那么嵌套此事件的所有元素都会被触发一次Click事件,注意:只会触发他的直系亲属元素,而与其自己,父级, ...

  3. init system

    参考:5 Best Modern Linux ‘init’ Systems (1992-2015) 参考:Linux开机流程 参考:<鸟哥的 Linux 私房菜:基础学习篇 第四版>第十七 ...

  4. IT基础架构

  5. 分析可变形字符串序列StringBuilder 以及 StringBuffer之默认大小与扩容

    默认值初始化: 1.  首先明确 StringBuffer类与 StringBuilder类均继承了抽象类 AbstractStringBuilder类 无参构造方法 2. 源码中StringBuff ...

  6. Ubuntu系统---报错Assertion '0' failed

    Ubuntu系统---报错Assertion '0' failed YOLO V3,CUDA Error: out of memory darknet: ./src/cuda.c:36: check_ ...

  7. GPU显存释放

    一.当程序没有运行,但GPU仍被占用, 可通过nvidia-smi查看,被占用的pid是什么 或通过sudo fuser -v /dev/nvidia* #查找占用GPU资源的PID 然后采用kill ...

  8. 用.htaccess 禁止IP访问

    用.htaccess 禁止某IP访问 Order Allow,Deny Allow from all Deny from 1.1.1.1 2.2.2.2 3.3.3.3 允许所有,禁止xxxx,请将里 ...

  9. linux上构建ftp服务器

    linux上构建ftp服务器 服务器搭建 https://help.aliyun.com/knowledge_detail/60152.html,可以参考这篇博文. 配置文件详解 进入/etc/vsf ...

  10. xfs 文件系统

    centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext3和ext4的最大区别在于,ext3在fsck时需要耗费大量时间(文件越多,时间越长),而ext4 ...