转载自:http://blog.youkuaiyun.com/bertzhang/article/details/7219060
1、多线程的创建
线程的创建比较简单,先举一个例子热热身:
- #include <stdio.h>
- #include <pthread.h>
- void* Handler(void* param) {
- char* message = static_cast<char*>(param);
- printf("%s\n", message);
- }
- int main(int argc, char** argv) {
- pthread_t thread_id;
- char message[] = "hello world";
- pthread_create(&thread_id, NULL, Handler, message);
- void* ret = NULL;
- pthread_join(thread_id, &ret);
- }
- #include <stdio.h>
- #include <pthread.h>
- class ThreadBase {
- public:
- static void* Handler(void* param) {
- char* message = static_cast<char*>(param);
- printf("%s\n", message);
- }
- };
- int main(int argc, char** argv) {
- pthread_t thread_id;
- char message[] = "hello world";
- pthread_create(&thread_id, NULL, ThreadBase::Handler, message);
- void* ret = NULL;
- pthread_join(thread_id, &ret);
- }
解决方案有三个:
1)通过一个非成员函数包装一下这个类,非成员函数的参数是类的对象,有了类的对象就可一调用类的成员函数了,示例代码如下:
- #include <stdio.h>
- #include <pthread.h>
- #include <string>
- class ThreadBase {
- public:
- void SetMessage(const char* message) {
- message_ = message;
- }
- void Handler() {
- printf("%s\n", message_.c_str());
- }
- private:
- std::string message_;
- };
- void* ThreadCall(void* object) {
- ThreadBase* thread_base = static_cast<ThreadBase*>(object);
- thread_base->Handler();
- }
- int main(int argc, char** argv) {
- pthread_t thread_id;
- char message[] = "hello world";
- ThreadBase thread_base;
- thread_base.SetMessage(message);
- pthread_create(&thread_id, NULL, ThreadCall, &thread_base);
- void* ret = NULL;
- pthread_join(thread_id, &ret);
- }
2)当然这个非成员函数也可以是类的静态成员函数,那么结果将是下面这个样式:
- #include <stdio.h>
- #include <pthread.h>
- #include <string>
- class ThreadBase {
- public:
- void SetMessage(const char* message) {
- message_ = message;
- }
- void Handler() {
- printf("%s\n", message_.c_str());
- }
- static void* ThreadCall(void* object) {
- ThreadBase* thread_base = static_cast<ThreadBase*>(object);
- thread_base->Handler();
- }
- private:
- std::string message_;
- };
- int main(int argc, char** argv) {
- pthread_t thread_id;
- char message[] = "hello world";
- ThreadBase thread_base;
- thread_base.SetMessage(message);
- pthread_create(&thread_id, NULL, ThreadBase::ThreadCall, &thread_base);
- void* ret = NULL;
- pthread_join(thread_id, &ret);
- }
3)另线程创建的工作在类的内部完成,使得类具有对立运行的性质,熟悉java的同学对下面的实现一定非常熟悉:
- #include <stdio.h>
- #include <pthread.h>
- #include <string>
- class ThreadBase {
- public:
- virtual ~ThreadBase() {}
- void SetMessage(const char* message) {
- message_ = message;
- }
- void Start() {
- pthread_create(&thread_id_, NULL, Hook, this);
- }
- void* Join() {
- void* ret = NULL;
- pthread_join(thread_id_, &ret);
- return ret;
- }
- virtual void Run() {
- printf("%s\n", message_.c_str());
- }
- private:
- static void* Hook(void* object) {
- ThreadBase* thread_base= static_cast<ThreadBase*>(object);
- thread_base->Run();
- }
- pthread_t thread_id_;
- std::string message_;
- };
- class ThreadDerived : public ThreadBase {
- public:
- virtual void Run() {
- printf("a new derived multi-thread object is running\n");
- }
- };
- int main(int argc, char** argv) {
- pthread_t thread_id;
- char message[] = "hello world";
- ThreadBase thread_base;
- thread_base.SetMessage(message);
- thread_base.Start();
- thread_base.Join();
- ThreadDerived thread_derived;
- thread_derived.Start();
- thread_derived.Join();
- }
有了这个ThreadBase基类,再创建支持多线程的类就非常容易了,只要继承并实现Run函数就可以了。
参考文献:
https://computing.llnl.gov/tutorials/pthreads/
http://www.dutor.net/index.php/2011/11/pthread-in-cpp-class/
http://stackoverflow.com/questions/1151582/pthread-function-from-a-class