Thread类:muduo库中的线程封装类。
类图:
私有成员变量:
started:表示线程是否启动
pthreadId:Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。
tid:该线程的真实id,可以唯一标识一个线程
func:该线程要回调的一个函数
name:线程名称
numcreated:已经创建的线程的个数,muduo封装的32位原子整数。
私有成员函数:
stratThread():线程入口函数
runinthread():被入口函数调用,再调用Func回调函数
公有成员函数:
start():启动线程
join():加入线程
started():线程是否启动
tid():线程tid
name():返回线程名称
numCreated():已经启动的线程个数
currentThread命名空间中有多个变量,每个变量前都有__thread关键字,以及extern关键字
extern关键字:用在变量声明中常有这样一个作用,在*.c文件中声明一个全局变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
__thread关键字:gcc内置的线程局部存储设施,所属线程内使用,不同线程间不会共享此变量,__thread只能修饰POD类型
POD类型(plain old data):与C兼容的原始数据,例如,结构和整型等C语言中的类型是 POD 类型,但带有用户定义的构造函数或虚函数的类则不是
__thread string t_obj1(“cppcourse”); // 错误,不能调用对象的构造函数
__thread string* t_obj2 = new string; // 错误,初始化只能是编译期常量
__thread string* t_obj3 = NULL; // 正确
非pod类型想要每个线程一份可以使用线程特定数据tsd
Thread类使用示例:
#include <muduo/base/Thread.h>
#include <muduo/base/CurrentThread.h>
#include <string>
#include <boost/bind.hpp>
#include <stdio.h>
#include <unistd.h>
void mysleep(int seconds)
{
timespec t = { seconds, 0 };
nanosleep(&t, NULL);
}
void threadFunc()
{
printf("tid=%d\n", muduo::CurrentThread::tid());
}
void threadFunc2(int x)
{
printf("tid=%d, x=%d\n", muduo::CurrentThread::tid(), x);
}
void threadFunc3()
{
printf("tid=%d\n", muduo::CurrentThread::tid());
mysleep(1);
}
class Foo
{
public:
explicit Foo(double x)
: x_(x)
{
}
void memberFunc()
{
printf("tid=%d, Foo::x_=%f\n", muduo::CurrentThread::tid(), x_);
}
void memberFunc2(const std::string& text)
{
printf("tid=%d, Foo::x_=%f, text=%s\n", muduo::CurrentThread::tid(), x_, text.c_str());
}
private:
double x_;
};
int main()
{
printf("pid=%d, tid=%d\n", ::getpid(), muduo::CurrentThread::tid());
muduo::Thread t1(threadFunc);
t1.start();
printf("t1.tid=%d\n", t1.tid());
t1.join();
//bind绑定普通函数
muduo::Thread t2(boost::bind(threadFunc2, 42),
"thread for free function with argument");
t2.start();
printf("t2.tid=%d\n", t2.tid());
t2.join();
//bind绑定成员函数
Foo foo(87.53);
muduo::Thread t3(boost::bind(&Foo::memberFunc, &foo),
"thread for member function without argument");
t3.start();
t3.join();
muduo::Thread t4(boost::bind(&Foo::memberFunc2, boost::ref(foo), std::string("Shuo Chen")));
t4.start();
t4.join();
printf("number of created threads %d\n", muduo::Thread::numCreated());
}
运行结果: