封装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的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
随机推荐
- Headless Service 和Service
定于spec:clusterIP: None 还记得Service的Cluster IP是做什么的吗?对,一个Service可能对应多个EndPoint(Pod),client访问的是Cluster ...
- PHP获取POST的几种方法
一.PHP获取POST数据的几种方法 方法1.最常见的方法是:$_POST['fieldname'];说明:只能接收Content-Type: application/x-www-form-urlen ...
- WebAPI调用笔记
前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于Http协议的Get.Po ...
- vue-element-ui之弹窗重置
遇到列表中需要给弹框赋默认值并且关闭后需要清空数据+清除验证时可以这么写:
- Kotlin 使用类似C# 的yield功能
用过c#的可能对 yield 关键字爱不释手,那么在像我这种被迫上java贼船的人,就想找到类似的功能. 我使用的是kotlin,下面的方法演示了产生一个序列的功能. val fibonacciSeq ...
- 数学运算比IF要快
问题 虽然很早就知道,CPU在处理 if 这样的判断语句时,使用了预测的技术,所以如果条件总是一个结果,效率就很好.反过来说,如果你使用数学运算避免 if 判断,那么就意味着性能一定比 if 要好. ...
- PHP基础入门(五)---PHP面向对象实用基础知识
前言: 今天来和大家介绍一下PHP的面向对象.说到面向对象,我不得不提一下面向过程,因为本人在初学时,常常分不清楚面向对象和面向过程,下面就来给大家介绍一下它们的区别: 面向对象专注于由哪个对象来处理 ...
- asp.netajax与jquery和bootstrap的无刷新完美实现
20190421asp.netajax与jquery和bootstrap的无刷新完美实现 设计代码和后台代码中重要部分加粗和深色以及字号加大. 设计前台代码: <%@ Page Title=&q ...
- 常用的lamp环境以及一些依赖包的安装
- git操作github仓库基本操作
一.登录 首次登录 $ git config --global user.name "Your Name" $ git config --global user.email ‘yo ...