封装Thread的两种方法 via C++ in Linux
方法一: 代理线程函数(proxyThreadFunc)作为类的静态成员函数, 回调函数指针作为类的私有成员变量
方法二: 代理线程函数(proxyThreadFunc)作为全局函数, 回调函数指针作为自定义结构体的成员
Noncopyable.h:
#ifndef _Noncopyable_H_
#define _Noncopyable_H_ class Noncopyable
{
public:
Noncopyable(){}
~Noncopyable(){} private:
Noncopyable(const Noncopyable & a){}
void operator=(const Noncopyable & a){}
}; #endif
Thread.h:
#ifndef _Thread_H_
#define _Thread_H_ #include "Noncopyable.h"
#include <functional>
#include <pthread.h> /*====================
====================*/ class Thread : public Noncopyable
{
public:
typedef std::function<void ()> ThreadFunc;
Thread(ThreadFunc func)
:thread_id(), running_status(-), callback_func(func)
{}
virtual ~Thread()
{
if(!running_status)
pthread_detach(thread_id);
} virtual void start() = ;
virtual void join() = ; protected:
pthread_t thread_id;
int running_status;
ThreadFunc callback_func;
}; /*====================
====================*/ class ThreadStruct : public Thread
{
public:
ThreadStruct(ThreadFunc func)
:Thread(func)
{}
~ThreadStruct(){} virtual void start() override;
virtual void join() override;
}; /*====================
====================*/ class ThreadStatic : public Thread
{
public:
ThreadStatic(ThreadFunc func)
:Thread(func)
{}
~ThreadStatic(){} virtual void start() override;
virtual void join() override; private:
static void * proxyThreadFunc(void *);
}; #endif
Thread.cpp:
#include "Thread.h" /*====================
====================*/ struct ThreadData
{
typedef Thread::ThreadFunc ThreadFunc;
ThreadFunc cbfunc; ThreadData(ThreadFunc func)
:cbfunc(func)
{} void runThread()
{
cbfunc();
}
}; void * proxyThreadFunc(void * arg)
{
ThreadData * pd = NULL;
pd = static_cast<ThreadData *>(arg);
pd->runThread();
delete pd;
return NULL;
} void ThreadStruct::start()
{
ThreadData * td = NULL;
td = new ThreadData(callback_func);
if(pthread_create(&thread_id, NULL, proxyThreadFunc, td) < )
delete td;
} void ThreadStruct::join()
{
pthread_join(thread_id, NULL);
} /*====================
====================*/ void * ThreadStatic::proxyThreadFunc(void * arg)
{
ThreadStatic * pd = NULL;
pd = static_cast<ThreadStatic *>(arg);
pd->callback_func();
return NULL;
} void ThreadStatic::start()
{
pthread_create(&thread_id, NULL, proxyThreadFunc, this);
} void ThreadStatic::join()
{
pthread_join(thread_id, NULL);
}
ThreadMain.cpp:
#include "Thread.h" #include <iostream>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h> using namespace std; class Test
{
public:
void foo()
{
cout << "foo()" << endl;
} void bar(int i)
{
cout << "bar(" << i << ")" << endl;
}
}; /*====================
====================*/ class TestThread
{
public:
TestThread()
:cnt(), pThread(NULL)
{} void threadFunc()
{
while(cnt < )
{
sleep();
cout << "cnt = " << ++cnt << endl;
}
} void start()
{
pThread->start();
} void join()
{
pThread->join();
} void attach(Thread * th)
{
pThread = th;
} private:
int cnt;
Thread * pThread; //类的组合
}; /*====================
====================*/ int main()
{
Thread * p1, * p2;
TestThread tt;
tt.attach(new ThreadStatic(bind(&TestThread::threadFunc, &tt)));
Test test;
p1 = new ThreadStruct(bind(&Test::foo, &test));
p2 = new ThreadStatic(bind(&Test::bar, &test, )); tt.start();
p1->start();
p2->start();
tt.join();
p1->join();
p2->join();
delete p1;
delete p2;
}
封装Thread的两种方法 via C++ in Linux的更多相关文章
- C# web api返回类型设置为json的两种方法
web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...
- 使用PHP发送邮件的两种方法
使用PHP发送邮件的两种方法 May242013 作者:Jerry Bendy 发布:2013-05-24 22:25 分类:PHP 阅读:2,107 views 抢沙发 今天 ...
- hive权威安装出现的不解错误!(完美解决)两种方法都可以
以下两种方法都可以,推荐用方法一! 方法一: 步骤一: yum -y install mysql-server 步骤二:service mysqld start 步骤三:mysql -u root - ...
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)
Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- C模块回调Lua函数的两种方法
作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- 原生Js 两种方法实现页面关键字高亮显示
原生Js 两种方法实现页面关键字高亮显示 上网看了看别人写的,不是兼容问题就是代码繁琐,自己琢磨了一下用两种方法都可以实现,各有利弊. 方法一 依靠正则表达式修改 1.获取obj的html2.统一替换 ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
随机推荐
- mac电脑上不能用移动硬盘的原因和方法
原因: 一般性是因为这个移动硬盘的格式是 NTFS 格式的,对于这种格式的磁盘格式,在苹果系统中却是不支持往硬盘里写入数据的 解决方法: 方法一: ntfs的格式分区,这种格式分区与我们的苹果电脑自身 ...
- 还能不能愉快地起一个web服务啦?——1st Step!白话http和代码交互的那点儿事儿~
学写python的时候,我们多多少少都接触到了web程序,然而你有没有想过,当浏览器发送了一个http请求时,等待接收这个请求的后端代码是一种什么样的思想感情? 就像下面这张图里画的一样,后端也许是一 ...
- Flask Vue.js全栈开发
Flask Vue.js全栈开发的 最新完整代码 及使用方式 本系列的最新代码及使用方式将持续更新到: http://www.madmalls.com/blog/post/latest-code/ 1 ...
- hdu6395 (矩阵快速幂+分块)
Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In Hand Onli ...
- angular实操
一.创建angular工程(一定要在管理员权限下运行,Windows可忽略) 1.安装angular CLi 在终端窗口打开想要创建的工程所在文件夹,如:Cd Desktop\Angular-proj ...
- Python数据类型——字符串
概论 字符串顾名思义就是一串字符,由于Python中没有“字符”这种数据类型,所以单个的字符也依然是字符串类型的.字符串可以包含一切数据,无论是能从键盘上找到的,还是你根本都不认识的.与数一样,字符串 ...
- TF-IDF特征选择
- Apache Spark 3.0 将内置支持 GPU 调度
如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...
- Linux c获取任意路径的硬盘使用情况
没有什么好说的,其实就是获取硬盘的statfs信息结构 代码如下: #include <stdio.h> #include <stdlib.h> #include <sy ...
- JavaScript超酷时钟的制作
<!DOCTYPE html PUBLIC "-//W3C//h2D XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...