c++线程使用

一直习惯用c语言的方法创建线程,即pthread_create和_beginthread,但总觉得这样不够面向对象。c++创建线程有两种方法:基于对象的方法和面向对象的方法。面向对象创建线程相比较面向过程的优点是可以复用一些公共函数,像线程的开始,线程的结束,线程的暂停等等。

基于对象创建线程代码:

class Thread
{
public:
typedef std::function ThreadFunc;
explicit Thread(const ThreadFunc&, const string& name = string());
pthread_t m_thread_id;
Thread();
~Thread();
void start();
void suspendPthread();
void pthread_resume();
void pthread_suspend();
bool m_status;
pthread_mutex_t m_mutex;
int flag = 1;
pthread_cond_t m_cond;
pthread_t m_thread;
ThreadFunc m_func;
string     m_name;
};
struct ThreadData
{
typedef Thread::ThreadFunc ThreadFunc;
ThreadFunc func_;
string name_;
ThreadData(const ThreadFunc& func,
const string& name)
: func_(func),
name_(name)
{}

void runInThread()
{
::prctl(PR_SET_NAME, name_.data());
try
{
func_();
}
catch (const Exception& ex)
{
fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());
fprintf(stderr, "reason: %s\n", ex.what());
fprintf(stderr, "stack trace: %s\n", ex.stackTrace());
abort();
}
catch (const std::exception& ex)
{

fprintf(stderr, "exception caught in Thread %s\n", name_.c_str());
fprintf(stderr, "reason: %s\n", ex.what());
abort();
}
catch (...)
{
fprintf(stderr, "unknown exception caught in Thread %s\n", name_.c_str());
throw; // rethrow
}
}


};
void* startThread(void *arg)
{
ThreadData *data = (ThreadData *)arg;
data->runInThread();
delete data;
return NULL;
}


Thread::Thread(const ThreadFunc &func, const string & name) : m_func(func), m_name(name)
{


}


Thread::Thread()
{
}




Thread::~Thread()
{


}


void Thread::start()
{
ThreadData* data = new ThreadData(m_func, m_name);
pthread_create(&m_thread_id, 0, &startThread, data);
}


void Thread::pthread_suspend()
{
pthread_mutex_lock(&m_mutex);
flag--;
pthread_mutex_unlock(&m_mutex);
}


void Thread::suspendPthread()
{
if (flag <= 0)
{
pthread_mutex_lock(&m_mutex);
pthread_cond_wait(&m_cond, &m_mutex);
pthread_mutex_unlock(&m_mutex);
}
}


void Thread::pthread_resume()
{
pthread_mutex_lock(&m_mutex);
flag++;
pthread_cond_signal(&m_cond);
pthread_mutex_unlock(&m_mutex);
}

基于对象创建线程的方法:基于对象的线程创建主要使用c++的bind和function函数,相比较于面向对象的方法好处是可以避免继承。首先创建一个Thread的类,类接受一个仿函数,负责线程的实际执行,由参数列表传入。Thread类可以看到主要作用是进行线程的控制,里面有像start,stop,resume等控制函数,具体的实现不同系统可能不同。在thread类内也可以再创建一个Threaddata的类,负责执行新线程。当要创建线程的时候,直接new Thread(func),func是新线程要执行的函数,即可。

其次是面向对象的线程创建方法:比较简单。创建一个线程类Thread,主要负责创建新线程,控制线程的开始结束停止等等。然后继承Thread类,重写里面的start函数。

你可能感兴趣的:(c++线程使用)