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. AlterDialog对话框的使用

    第一步先写出layout文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  2. 将mysql从5.5.25升级到8.0.12

    将mysql从5.5.25升级到8.0.12过程中遇到几个问题,记录如下: 将数据库安装好后,导入原来的数据,启动tomcat,报错unable to load authentication   ca ...

  3. zookeeper:3

    zoo.cfg配置文件 tickTime=2000  :zookeeper中最小的时间单位长度 (ms). initLimit=10  :follower节点启动后与leader节点完成数据同步的时间 ...

  4. linux 安装 wkhtmltox

    linux安装wkhtmltox wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox- ...

  5. Scyther 形式化分析工具资料整理(三)

    1.作者Cas Cremers在做TLS1.3的时候我么发现并没有使用Scyther 形式化丰分析工具对其进行分析,而是使用了 The Tamarin .作者建立了TLS.13的模型. 那么我的目标是 ...

  6. 深入理解Kubernetes资源限制:CPU

    写在前面 在上一篇关于Kubernetes资源限制的文章我们讨论了如何通过ResourceRequirements设置Pod中容器内存限制,以及容器运行时是如何利用Linux Cgroups实现这些限 ...

  7. C++ ---释放内存(new和delete)

    C++ ---释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html -------------------------------- ...

  8. 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)

    牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...

  9. Pytest【定制fixture】

    在pytest中的fixture是在测试函数运行前后,由pytest执行的外壳函数,fixture中的代码可以定制,满足多变的测试需求:包括定义传入测试中的数据集.配置测试前系统的初始化状态.为批量测 ...

  10. WCF Endpoint分类

    WCF中可以为一个Service配置多个Endpoint 这些Endpoint的分类方法有下面3中 1.全局就一个endpoint,一个接口公开所有的方法,这适合简单的业务场景 2.将endpoint ...