muduo库学习笔记五:base库之Thread类

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());
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值