time_t实际上是长整型long int,它用来 保存从1970年1月1日0时0分0秒到现在时刻的秒数,用time()这个函数获取
gmtime
- 函数原型:struct tm* gmtime(time_t* time)
- 函数功能:得到以结构tm表示的时间信息
- 函数返回:以结构tm表示的时间信息指针
- 所述文件:
<time.h>
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { time_t t; struct tm* gmt; t = time(NULL); gmt = gmtime(&t); return 0; }
tm结构体
struct tm { int tm_sec; // seconds int tm_min; // minutes int tm_hour; // hours int tm_mday; // day int tm_mon; // month int tm_year; // year-1900 int tm_wday; // day of week[0-6] int tm_yday; // days in year[0-365] int tm_isdst; // DST [-1/0/1] #ifdef __USE_BSD long int tm_gmtoff; // seconds east of UTC __const char* tm_zone; // Timezone abbreviation #else long int __tm_gmtoff; // seconds east of UTC __const char* __tm_zone; // Timezone abbreviation #endif };
timeval结构体
struct timeval结构体在time.h中定义:
struct timeval { time_t tv_sec; // seconds suseconds_t tv_usec; // Microseconds };
其中,tv_sec为EPoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头,假如tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒。
gettimeofday()
获取当前时间(保存在结构体timeval中)
share_from_this
当类对象被shared_ptr管理时,需要在类自己定义的函数里把当前对象作为参数传给其他函数时,这时需要传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义(因为一个raw poiter指向这个类对象,而shared_ptr对类对象的这个引用没有计数,很可能shared_ptr已经把类对象资源释放了,而那个调用函数还在使用类对象)。
对一个类 A ,当我们希望使用 shared_ptr 来管理其类对象时,而且需要在自己定义的函数里把类对象 shared_ptr (为什么不用普通指针,当我们使用智能指针管理资源时,必须统一使用智能指针,而不能在某些地方使用智能指针某些地方使用 raw pointer ,否则不能保持智能指针的语义,从而产生各种错误)传给其他函数时,可以让类 A 从 enable_shared_from_this 继承:
class A : public boost::enable_shared_from_this<A> {};
然后在类A中需要传递类对象本身shared_ptr的地方使用shared_from_this函数获得指向自身的shared_ptr。
boost::shared_from_this值得注意的地方
这个 函数仅在
shared_ptr<T>
的构造函数被调用之后才能使用,原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this<T>
构造函数中设置,而是在shared_ptr<T>
的构造函数中进行设置。- 如下代码是错误的
class D : public boost::enable_shared_from_this<D> { public: D() { boost::shared_ptr<D> p = shared_from_this(); } };
在D的构造函数中虽然可以保证
enable_shared_from_this<D>
的构造函数已经被调用,但是weak_ptr还没有设置。- 如下代码是错误的
class D : public boost::enable_shared_from_this<D> { public: void func() { boost::shared_ptr<D> = shared_from_this(); } }; void main() { D d; d.func(); }
错误原因同上。
- 如下代码是正确的
void main() { boost::shared_ptr<D> d(new D); d->func(); }
这里
boost::shared_ptr<D> d(new D)
实际上执行了3个动作:- 首先调用
enable_shared_from_this<D>
的构造函数; - 其次调用D的构造函数;
- 最后调用
shared_ptr<D>
的构造函数。
是第3个动作设置了
enable_shared_from_this<D>
的weak_ptr,而不是第1个动作。shared_from_this使用场景
需求:在类的内部需要自身的shared_ptr而不是this裸指针
场景:在类中发起一个异步操作,callback回来要保证发起操作的对象仍然有效
异步回调的时候对象可能已经销毁了,所以使用shared_ptr传出去就是保证最少还有一个引用计数维持对象的生命周期直至回调结束。
__thread
__thread
是GCC内置的线程局部存储设施,存储效率可以和全局变量相比,__thread
变量每一个线程有一份独立实体,各个线程的值互不干扰getpid、SYS_gettid以及pthread_self
getpid()得到的是进程的pid,在进程中,每个线程都有自己的pid,要得到线程的pid,必须用syscall(SYS_gettid),其在系统内是唯一的,pthread_self函数获取的是线程ID,线程ID在某进程中是唯一的,在不同的进程中创建的线程可能会出现ID值相同的情况。