封装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的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
随机推荐
- python3读写csv文件
python读取CSV文件 python中有一个读写csv文件的包,直接import csv即可.利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下. 1. 读文件 csv_ ...
- React文档(二十三)Web Components
React和web components是为了解决不同问题而创立的.web components为可重用组件提供了健壮的封装,而React提供了声明式的库来保持DOM和数据同步.这两点是互相补充的.作 ...
- Shell 脚本练习
[第一个] #!/bin/bash#每个用户的总充值和消费以及剩余. cat yuanbao.txt |grep -v 2016 |awk '{print $3}' |awk '!a[$0]++' & ...
- 解决反射型XSS漏洞攻击
对于程序员来说安全防御,无非从两个方面考虑,要么前端要么后台. 一.首先从前端考虑过滤一些非法字符. 前端的主控js中,在<textarea> 输入框标签中,找到点击发送按钮后,追加到聊天 ...
- 不同浏览器中scrollHeight的比较
每个浏览器的兼容性不同所以就有了如下判断方案 document.body是DOM中Document对象里的body节点, document.documentElement是文档对象根节点(html)的 ...
- raid卡的结构示意图
raid卡的结构示意图,取自<大话存储>第124页 ROM:一般用FLash芯片做ROM,存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码; XOR芯片:专门用来做RAID ...
- 框架-thrift-zookeeper-kafka
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 ...
- so so.*.*
转自:http://unix.stackexchange.com/questions/5719/linux-gnu-gcc-ld-version-scripts-and-the-elf-binary- ...
- session和cookie的区别是什么,他们都是什么.
Session是存储在服务器端的,Cookie是存储在客户端的. Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息.如何识别特定的客户呢?cookie就可以做到.每次HTTP请求时, ...
- 四:(之九_容器资源限制)Dockerfile语法梳理和实践
9 容器资源限制 9.1 Virtualbox :工具操作 9.2 内存限制 docker --help 只限定memory bytes,则memory-swap默认与其存储相同. 资源限制生效: ...