关于C++中posix pthread线程函数在类中封装的问题
2009-08-12 16:00
316 查看
我们通常有这样的需求:需要在C++中用多线程处理可以并行处理的问题,且把线程函数封装在类中,而把线程函数封装在类中,导致了this指针作为默认的参数被传进了函数中,从而和线程函数参数不能匹配,不能通过编译。
市面上一般有以下几种解决方案:
1. 将线程函数作为全局函数, 从而避免了this指针作为隐含参数的作怪行为,但这样线程函数却无法访问类中的私有变量,此为一大缺憾。
解决方案: 是把所有的私有变量变为全局变量,这样极大程度上破坏了类的封装性。
2. 引入友元函数,从而可以访问私有变量,这种方法我没有试过,试过了再补充上来。
3. 将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
view plain
copy to clipboard
print
?
#include <iostream>
#include "pthread.h"
using
namespace
std;
class
A;
struct
ARG
{
A* pThis;
string var;
};
class
A
{
public
:
A();
~A();
static
void
*
thread
(
void
* args);
void
excute();
private
:
int
iCount;
};
A::A()
{
iCount = 10;
}
A::~A()
{
}
void
* A::
thread
(
void
* args)
{
ARG *arg = (ARG*)args;
A* pThis = arg->pThis;
string var = arg->var;
cout<<"传入进来的参数var: "
<<var<<endl;
cout<<"用static线程函数调用私有变量: "
<<pThis->iCount<<endl;
}
void
A::excute()
{
int
error;
pthread_t thread_id;
ARG *arg = new
ARG();
arg->pThis = this
;
arg->var = "abc"
;
error = pthread_create(&thread_id, NULL, thread
, (
void
*)arg);
if
(error == 0)
{
cout<<"线程创建成功"
<<endl;
pthread_join(thread_id, NULL);
}
}
int
main()
{
A a;
a.excute();
return
0;
}
上述代码在G++下编译通过, 本篇小总结基本涵盖了线程函数在类中封装的问题。
市面上一般有以下几种解决方案:
1. 将线程函数作为全局函数, 从而避免了this指针作为隐含参数的作怪行为,但这样线程函数却无法访问类中的私有变量,此为一大缺憾。
解决方案: 是把所有的私有变量变为全局变量,这样极大程度上破坏了类的封装性。
2. 引入友元函数,从而可以访问私有变量,这种方法我没有试过,试过了再补充上来。
3. 将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
view plain
copy to clipboard
?
#include <iostream>
#include "pthread.h"
using
namespace
std;
class
A;
struct
ARG
{
A* pThis;
string var;
};
class
A
{
public
:
A();
~A();
static
void
*
thread
(
void
* args);
void
excute();
private
:
int
iCount;
};
A::A()
{
iCount = 10;
}
A::~A()
{
}
void
* A::
thread
(
void
* args)
{
ARG *arg = (ARG*)args;
A* pThis = arg->pThis;
string var = arg->var;
cout<<"传入进来的参数var: "
<<var<<endl;
cout<<"用static线程函数调用私有变量: "
<<pThis->iCount<<endl;
}
void
A::excute()
{
int
error;
pthread_t thread_id;
ARG *arg = new
ARG();
arg->pThis = this
;
arg->var = "abc"
;
error = pthread_create(&thread_id, NULL, thread
, (
void
*)arg);
if
(error == 0)
{
cout<<"线程创建成功"
<<endl;
pthread_join(thread_id, NULL);
}
}
int
main()
{
A a;
a.excute();
return
0;
}
#include <iostream> #include "pthread.h" using namespace std; class A; struct ARG { A* pThis; string var; }; class A { public: A(); ~A(); static void* thread(void* args); void excute(); private: int iCount; }; A::A() { iCount = 10; } A::~A() { } void* A::thread(void* args) { ARG *arg = (ARG*)args; A* pThis = arg->pThis; string var = arg->var; cout<<"传入进来的参数var: "<<var<<endl; cout<<"用static线程函数调用私有变量: "<<pThis->iCount<<endl; } void A::excute() { int error; pthread_t thread_id; ARG *arg = new ARG(); arg->pThis = this; arg->var = "abc"; error = pthread_create(&thread_id, NULL, thread, (void*)arg); if (error == 0) { cout<<"线程创建成功"<<endl; pthread_join(thread_id, NULL); } } int main() { A a; a.excute(); return 0; }
上述代码在G++下编译通过, 本篇小总结基本涵盖了线程函数在类中封装的问题。
相关文章推荐
- 关于C++中posix pthread线程函数在类中封装的问题
- 关于c++ 线程创建的线程运行函数和线程运行函数的参数(即pthread_creat()第3,4个参数)
- C++中类的成员函数作为 pthread_create的线程函数
- 关于C++与Java中虚函数问题的读书笔记
- C++中线程函数中方访问成员变量的问题
- Linux/Unix 编程中 POSIX 函数的线程安全问题
- 在C++里面关于strcpy()函数和strcpy_s()函数的问题
- posix 线程和pthread 系列函数
- C++里关于函数fun的小问题
- 关于c++中类静态成员函数可能破坏类封装性的问题
- Linux/Unix 编程中 POSIX 函数的线程安全问题
- 关于线程插入函数如何用的问题
- 关于线程加了锁未解锁和pthread_cleanup_push函数遇到的问题
- Linux/Unix 编程中 POSIX 函数的线程安全问题
- 关于C++中的函数返回局部string的问题
- 关于C++调用C#封装的dll后,获取C#中string返回值的问题
- 关于C++多重继承的时候虚函数覆盖的问题
- C++中关于将fstream对象作为函数参数传递相关问题说明
- 关于C++当中的函数作为另一个函数的参数之小问题
- linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序