第一种方法
#include <pthread.h>
#include <iostream>
using namespace std;
class ThreadBase {
public:
void Start() {
pthread_t tid;
pthread_create(&tid, NULL, &ThreadBase::DoStart, (void*)this);
}
private:
virtual void Run() = 0;
static void* DoStart(void* ptr) {
((ThreadBase*)(ptr)) -> Run();
return NULL;
}
};
class Runner: public ThreadBase {
public:
Runner(int a) : a_(a) {}
void Incr() { ++a_; }
private:
void Run() {
while (1) {
cout << "Count: " << a_ << endl;
sleep(1);
}
}
int a_;
};
int main() {
Runner run(0);
run.Start();
while (1) {
run.Incr();
sleep(1);
}
}
#include <iostream>
#include <boost/thread/thread.hpp>
#include<boost/bind.hpp>
#include<boost/function.hpp>
using namespace std;
using namespace boost;
class ThreadBase
{
public:
typedef boost::function<void()> ThreadCallback;
ThreadBase(ThreadCallback cb) : cb_(cb) {
boost::thread(boost::bind(&ThreadBase::DoStart, this));
}
void DoStart() {
cb_();
}
private:
ThreadCallback cb_;
};
class Runner
{
public:
Runner(int a) : a_(a) {}
void Run() {
while (1) {
cout << "Count:" << a_ << endl;
sleep(1);
}
}
void Incr() { ++a_; }
private:
int a_;
};
int main() {
Runner run(0);
ThreadBase threadbase(boost::bind(&Runner::Run, &run));
while (1) {
run.Incr();
sleep(1);
}
return 0;
}
再用单例模式,改写一下第一个版本
#include <pthread.h>
#include <iostream>
using namespace std;
class ThreadBase {
public:
void Start() {
pthread_t tid;
pthread_create(&tid, NULL, &ThreadBase::DoStart, (void*)this);
}
private:
virtual void Run() = 0;
static void* DoStart(void* ptr) {
((ThreadBase*)(ptr)) -> Run();
return NULL;
}
};
class Runner: public ThreadBase {
public:
static Runner* Instance() {
static Runner r;
return &r;
}
void Init() {
a = 0;
Runner* pm = Runner::Instance();
pm->Start();
}
void Incr() { ++a; }
private:
void Run() {
while (true) {
sleep(2);
cout << "Count: " << a << endl;
}
}
int a;
Runner(){}
};
void* f(void* m) {
Runner* pm = Runner::Instance();
while (1) {
pm->Incr();
sleep(1);
}
return 0;
}
int main() {
Runner* pm = Runner::Instance();
pm->Init();
pthread_t p[4];
for (int i = 0; i < 4; ++i) {
pthread_create(&p[i], NULL, f, NULL);//在多个线程里面体现“单例”
}
sleep(1000);
return 0;
}