C++11中function物件作回撥函式的用法
阿新 • • 發佈:2019-02-04
Thread中的函式回撥方法,儲存著以後使用。
#ifndef THREAD_H_
#define THREAD_H_
#include <boost/noncopyable.hpp>
#include <functional>
#include <pthread.h>
class Thread : boost::noncopyable
{
public:
typedef std::function<void ()> ThreadCallback;
Thread(ThreadCallback callback);
~Thread();
void start();
void join();
static void *runInThread(void *);
private:
pthread_t threadId_;
bool isRunning_;
ThreadCallback callback_; //回撥函式
};
#endif //THREAD_H_
#include "Thread.h"
Thread::Thread(ThreadCallback callback)
: threadId_(0),
isRunning_(false),
callback_(std::move(callback))//move將表示式轉換為右值
{
}
Thread::~Thread()
{
if(isRunning_)
{
pthread_detach(threadId_);
}
}
void Thread::start()
{
pthread_create(&threadId_, NULL, runInThread, this);
isRunning_ = true;
}
void Thread::join()
{
pthread_join(threadId_, NULL);
isRunning_ = false;
}
void *Thread::runInThread(void *arg)
{
Thread *pt = static_cast<Thread*>(arg);
pt->callback_(); //呼叫回撥函式
return NULL;
}
(1) 將普通函式作為回撥函式
void foo()
{
while(1)
{
printf("foo\n");
sleep(1);
}
}
int main(int argc, char const *argv[])
{
Thread t(&foo);
t.start();
t.join();
return 0;
}
(2) 類的成員函式作為回撥函式
class Foo
{
public:
void foo(int i)
{
while(1)
{
printf("foo %d\n", i++);
sleep(1);
}
}
};
int main(int argc, char const *argv[])
{
Foo f;
int i = 34;
Thread t(bind(&Foo::foo, &f, i));
t.start();
t.join();
return 0;
}
(3) 組合一個新的執行緒類
class Foo
{
public:
Foo()
: thread_(bind(&Foo::foo, this))
{
}
void start()
{
thread_.start();
thread_.join();
}
void foo()
{
while(1)
{
printf("foo\n");
sleep(1);
}
}
private:
Thread thread_;
};
int main(int argc, char const *argv[])
{
Foo f;
f.start();
return 0;
}