muduo网络库基础知识点—c++,Boost

typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]; 

T必须是完全类型 

在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。

在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。

但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问。

POSIX线程库通过维护一定的数据结构来解决这个问题,这个些数据称为(Thread-specific Data,或 TSD)。

线程特定数据也称为线程本地存储TLS(Thread-local storage)

对于POD类型的线程本地存储,可以用__thread关键字

 

线程特定数据


1.__thread : gcc内置的线程局部存储设施

__thread只能修饰POD类型

POD类型(plain old data),与C兼容的原始数据,例如,结构和整型等C语言中的类型是 POD 类型,但带有用户定义的构造函数或虚函数的类则不是

__thread string t_obj1(“cpp”); // 错误,不能调用对象的构造函数
__thread string* t_obj2 = new string; // 错误,初始化只能是编译期常量
__thread string* t_obj3 = NULL; // 正确



原文:https://blog.csdn.net/le119126/article/details/50283857

 

Timestamp类封装

 

class Timestamp : public muduo::copyable,
                  public boost::less_than_comparable<Timestamp>

 

  • muduo::copyable 空基类,标识类,值类型
  • less_than_comparable<Timestamp>
        要求实现<, =,可自动实现>,<=,>=
  • BOOST_STATIC_ASSERT 编译时断言,assert 运行时断言

使用PRId64

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> //
PRId64所在的头文件,在C++当中需要定义 __STDC_FORMAT_MACROS 宏才可以使用PRId64
#undef __STDC_FORMAT_MACROS
printf("%" PRId64 "\n", value);
 


 gcc原子性操作

// 原子自增操作
type __sync_fetch_and_add (type *ptr, type value)

// 原子比较和交换(设置)操作
type __sync_val_compare_and_swap (type *ptr, type oldval type newval)
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval)

// 原子赋值操作
type __sync_lock_test_and_set (type *ptr, type value)
//使用这些原子性操作,编译的时候需要加-march=cpu-type

  无锁队列实现
  http://coolshell.cn/articles/8239.html
  更多原子性操作
  http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Atomic-Builtins.html

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体系结构为本地平台

注:对原子操作与锁、volatile等讨论比较基础,更详细的探讨请参考这篇文章。、
http://www.voidcn.com/article/p-qdioxtkx-bv.html

Exception类实现

Exception.h, Exception_test.cc
Exception类实现
backtrace,栈回溯,保存各个栈帧的地址
backtrace_symbols,根据地址,转成相应的函数符号
abi::__cxa_demangle

异常 catch 引用类型

 

lower_bound 和 upper_bound

  lower_bound(begin, end, num);

  从数组的begin位置到end - 1位置二分查找第一个大于或者等于等于num的数字,找到返回数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到要找的数字下标。 

  upper_bound(begin, end, num);

  在数组的 begin位置到end - 1位置二分查找第一个大于num的数字,找到返回数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到要找的数字的数组下标。
 

 1 #include <set>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main(void)
 7 {
 8     int a[] = { 1, 2, 3, 4, 5 };
 9     set<int> s(a, a+5);
10 
11     cout<<*s.lower_bound(2)<<endl; //2
12     cout<<*s.upper_bound(2)<<endl; //3
13     return 0;
14 }

 

 

 

https://blog.csdn.net/jnu_simba/article/details/9107975

操作系统加载程序-》mainCRTStartup(这个时候初始化全局对象,调用构造) -> main 或winmain -> 返回 mainCRTStartup(返回后,crt调用exit,exit函数里寻找析构函数,然后调用) ->ExitProcess

posted on 2019-01-09 21:13  flysong  阅读(501)  评论(0编辑  收藏  举报

导航