muduo网络库学习之Timestamp类、AtomicIntegerT 类封装中的知识点
一、Timestamp类封装
class Timestamp : public muduo::copyable,public boost::less_than_comparable<Timestamp>类图如下:

1、muduo::copyable 空基类,标识类,值类型
2、less_than_comparable<Timestamp> 模板类
Timestamp 要求实现<, =,可自动实现>,<=,>=
3、成员 microSecondsSinceEpoch_ 是现在这个时刻距离1970-01-01 00:00:00 (UTC 时间) 的微秒数
4、BOOST_STATIC_ASSERT 编译时断言 assert 运行时断言
5、使用PRld64
int64_t 用来表示64位整数,在32位系统中是long long int,在64位系统中是long int,所以打印int64_t的格式化方法是:
printf(“%ld”, value); // 64bit OS
printf("%lld", value); // 32bit OS
跨平台的做法:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
二、AtomicIntegerT 类封装
template<typename T>
class AtomicIntegerT : boost::noncopyable
类图如下:

1、为什么需要原子性操作?
x++;
从内存中读x的值到寄存器中,对寄存器加1,再把新值写回x所处的内存地址

两个线程同时访问可能出现只加了一次的情况。
// 原子自增操作
type __sync_fetch_and_add (type *ptr, type value)
type tmp = *ptr; *ptr += value; return tmp;
// 原子比较和设置操作
type __sync_val_compare_and_swap (type *ptr, type oldval type newval)
if (*ptr == oldval) {
*ptr = newvalreturn oldval;}else return *ptr;
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval)
if (*ptr == oldval) {
*ptr = newval; return true;}else return false;
// 原子赋值操作
type __sync_lock_test_and_set (type *ptr, type value)
type tmp = *ptr; *ptr = value; return tmp;
使用这些原子性操作,编译的时候需要加-march=cpu-type 或者 -march = native
无锁队列实现 http://coolshell.cn/articles/8239.html
更多原子性操作 http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Atomic-Builtins.html
3、volatile 关键字
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化。
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用保存在寄存器中的备份。即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存。
补充:gcc/g++ 一些编译选项
-Wall // 大部分警告
-Wextra // 一些额外的警告
-Werror // 当出现警告时转为错误,停止编译
-Wconversion // 一些可能改变值的隐式转换,给出警告。
-Wno-unused-parameter // 函数中出现未使用的参数,不给出警告。
-Wold-style-cast // C风格的转换,给出警告
-Woverloaded-virtual // 如果函数的声明隐藏住了基类的虚函数,就给出警告。
-Wpointer-arith // 对函数指针或者void *类型的指针进行算术操作时给出警告
-Wshadow // 当一个局部变量遮盖住了另一个局部变量,或者全局变量时,给出警告。
-Wwrite-strings // 规定字符串常量的类型是const char[length],因此,把这样的地址复制给 non-const char *指针将产生警告. 这些警告能够帮助你在编译期间发现企图写入字符串常量 的代码-march=native // 指定cpu体系结构为本地平台
参考:muduo manual.pdf《linux 多线程服务器编程:使用muduo c++网络库》