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. MUI底部导航栏切换效果

    首先是html代码: <nav class="mui-bar mui-bar-tab"> <a href="view/templates/home/ho ...

  2. Computer Vision_33_SIFT:Distinctive Image Features from Scale-Invariant Keypoints——2004

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  3. 1.使用Vue.js实现品牌案例添加功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ndk学习之C语言基础复习----指针、函数、预处理器

    指针: 指针乃C.C++的灵魂之所在,所以有必要好好的复习复习.什么是指针?一句话来概括:“指针是一个变量,它的值是一个地址.”,其中指针变量的声明有如下三种形式: 其中第一种是被推荐的写法. 其中还 ...

  5. 【ecfinal2019热身赛】B题

    原题: 给你一个长度为1e5的序列ai,问你它的所有子序列的最大值与最小值之差的1000次方的和是多少 即∑_{p是a的子序列}(max{p}-min{p})^1000 这题难点在于(max-min) ...

  6. vue 标题上下滚屏 无缝轮播

    参考网址:https://www.jianshu.com/p/b6813193ca0d <template> <div class="wrap" :style=& ...

  7. Spring-HelloSpring-IOC创建对象的方式

    3.HelloSpring 思考 Hello 对象是谁创建的 ? [ hello 对象是由Spring创建的 ] Hello 对象的属性是怎么设置的 ? [hello 对象的属性是由Spring容器设 ...

  8. 根据IP获取经纬度 js

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  9. 第90题:子集II

    一. 问题描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1, ...

  10. validatebox自定义验证规则以及使用

    //===============jsp======state==== //开启验证 <script  type="text/javascript"> ​​​​​​​y ...