线程thread - 编程思维

怎么设计自己的线程类?

首先要设计线程类的使用方式:
例如像java创建和启动线程

class Thread {};

Thread t = new Thread(线程方法)
t.start()
t.join()

线程类基本的对象:

  1. 线程的方法(线程要做什么)
  2. 线程的标识(线程自己是谁)
  3. 线程的参数(这个要传递给线程方法)
  4. 线程的启动(线程具备的性质)
  5. 是否等待子线程(线程具备的性质)
class Thread
{
public:
    typedef boost::function<void ()> Func;
    Thread(const Func& func);
    ~Thread();

    void start();
    void join();

private:
    Func       func_;
    phtread_id pid_;
};

基于对象设计方式:boost::function + boost::bind

线程启动方式的设计

start() 是一个Thread的方法,而启动线程使用的是pthread_create,需要传入的是一个C函数,所以需要一个单独的C函数startThread去做启动线程这个工作。

void *startThread(void * args)
{
    ThreadData * data = static_cast<ThreadData*>(args);
    data->run();
}

startFunc函数中不可能知道Thread中的方法,所以需要设计一个单独的线程数据类ThreadData,这个ThreadData是个内部类,它会得到Thread类中的线程要执行方法,然后传递给startFunc,最后startFunc会调用ThreadData的run方法

ThreadData * data = new ThreadData(func_);
pthread_create(&tid_, NULL, startThread, data);

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://segmentfault.com/a/1190000000519368