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. # JDK7+ MethodHandle

    简单例子 import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.i ...

  2. K2 BPM_快消零售连锁行业门店选址解决方案_十年专注业务流程管理系统

    >>>业务流程管理软件选型攻略  快消零售连锁行业门店选址解决方案   业内有句名言:“门店最重要的是什么?第一是选址,第二是选址,第三还是选址” 选址是一个很复杂的综合性商业决策过 ...

  3. MySQL之系系统信息函数

    1.VERSION() 用法:返回MySQL服务器的版本 举例: mysql> select VERSION(); +-----------+ | VERSION() | +---------- ...

  4. 二〇一八-美团工程师面试解析(Java)

    一轮面试: 小数是怎么存的 算法题:N二进制有多少个1 Linux命令(不熟悉 JVM垃圾回收算法 C或者伪代码实现复制算法 volatile 树的先序中序后序以及应用场景 Mysql存储记录的数据结 ...

  5. Metasploit Penetration (第一夜加班)

    1.最近白天瞒着上班,晚自习看英语,还要瞒着写论文(现在是看,之前的部分章节被老师否定了,现在开始要从新进行整理)所以只有这晚上来开始看我的渗透测试了,发现渗透的很多知识,只要你平时不用很快就会生疏, ...

  6. C# 直播录制视频

    //项目引用 ffmpeg.exe 下载地址http://ffmpeg.org/ var time = DateTime.Now; ; //录制分钟 var fileName = Guid.NewGu ...

  7. PHP通过iconv将字符串从GBK转换为UTF8字符集

    PHP通过iconv将字符串从GBK转换为UTF8字符集的方法,需要的朋友可以参考下. 1. iconv()介绍 iconv函数可以将一种已知的字符集文件转换成另一种已知的字符集文件.例如:从GB23 ...

  8. Numpy API学习

    Numpy 常用API学习(全) 一.介绍 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 ...

  9. 用js刷剑指offer(替换空格)

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 牛客网链接 js代码 func ...

  10. webpack 配置react脚手架

    1 react 基本js文件: import React from 'react'; import ReactDOM from 'react-dom'; import App from './App. ...