加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

跨平台C++线程类

(2005-05-26 10:42:10)
标签:

杂谈

分类: MSN搬家

这个线程类提供几个基本的功能:创建线程、退出线程、获得线程ID、休眠,你可以在此基础上增加更多函数,比如 pthread_cancel = TerminateThread, pthread_join = WaitForSingleObject ...

#ifndef _MTHREAD_H_
#define _MTHREAD_H_

#ifdef WIN32
#include <process.h>
#else
#include <pthread.h>
#endif

class MThread
{
public:
 MThread():
   _pid(-1),
    _hthread(NULL)
   {
   }
   ~MThread()
   {
//    Close();
   }

   bool Create(unsigned long (*start_address)(void*), void* p)
   {
#ifdef WIN32
    //_pid = ::_beginthread((void(*)(void*))start_address, 0, p);
    _hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) start_address, p, 0, (unsigned long*)&_pid);
    //if (_pid == -1) //returns –1L on an error
    //    _brun = false;
    return (_pid != -1);
#else
    pthread_t pid;
    pthread_attr_t pattr;
    pthread_attr_init(&pattr);
    pthread_attr_setdetachstate(&pattr,PTHREAD_CREATE_DETACHED);

    pthread_create(&pid, &pattr,(void*(*)(void *))start_address, p);
    _pid= pid;
    pthread_attr_destroy(&pattr);
    return _pid != -1;
#endif
   }

   static void Sleep(unsigned long ms)
   {
#ifdef WIN32
    ::Sleep(ms);
#else
    struct timespec tp;
    tp.tv_sec = (int) ms/1000;
    tp.tv_nsec = ms%1000;
    try
    {
   nanosleep(&tp, &tp);
    }catch(...){}
#endif
   }

   static void ExitThread()
   {
#ifdef WIN32
    _endthread();
#else
    pthread_exit(NULL);
#endif
   }

#ifdef WIN32
   static DWORD        GetCurrentThreadID() { return ::GetCurrentThreadId(); }
#else   
   static  pthread_t   GetCurrentThreadID() { return ::pthread_self(); }
#endif

   int     _pid;
   void*  _hthread;
};

#endif

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有