封装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的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
随机推荐
- conda环境复制
配置环境是一个很烦的事,有时候用到服务器需要一遍又一遍的配..太麻烦了,这时候就要用到conda,直接复制已有的环境.事半功倍. 第一种方法:地址复制 首先找到要复制的环境的路径:conda info ...
- 转载aaa
前言 对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间 ...
- tensorflow lite的demo在android studio上环境搭建
由于很久没有接触过Android开发,而且最早用的是eclipse,所以这个demo在android studio上的搭建过程,真的是踩了不少坑.记录这篇文章,纯粹是给自己一点收获. 环境搭建的过程, ...
- K8s的调度策略
Scuedulor是K8s的调度器 sheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName为空的 pod,对每个 pod 都会创建一 ...
- 在idea中使用plantUML画类图
1.下载插件,搜uml找找就有了,安装重启idea. 2.会提示你找不到graphviz,下载msi安装. 3.提示not executable,需要配置环境变量,不是配置path,配置GRAPHVI ...
- git之我常用的命令
撤销修改: git checkout -- file 撤销暂存区: git reset HEAD git reset HEAD file 撤销版本库:git reset --hard HEAD^回到上 ...
- ARP协议分析(Wireshark)
一.说明 1.1 背景说明 以前学网络用的谢希仁的<计算机网络原理>,一是网开始学不太懂网络二是ARP协议是没有数据包格式的(如果没记错应该是没有).学完只记得老师说:ARP很简单的,就是 ...
- Python3+unittest使用教程
一.直接使用TestCase 注意所有测试方法都需要以test开头.代码如下: import unittest class Test1(unittest.TestCase): @classmethod ...
- jsp页面怎么引入js
人老了,容易忘记事情,再此记录 这里需要注意的是js文件夹要直接放在WebRoot或者WebContent文件夹下面,不要放在WEB-INF下面.因为TomCat对WEB-INF这个文件夹下面的资源是 ...
- 《推荐》安装Photoshop详细步骤 ,手把手,一步一步,具体详细地教你安装Photoshop (Adobe photoshop CS6)
现在的大学生必备技能,除了单反拍照,就是PS (Photoshop)了.可以说PS是一个强大的图片编辑处理软件,也是目前公认的最好的通用平面美术设计软件,它的功能完善,性能稳定,使用也很方便.几乎在所 ...