程序员的自我修养

线程调度

在优先级调度的环境下,线程优先级改变的方式有

  • 用户制定优先级
  • 根据进入等待状态的频繁程度提升或降低优先级
  • 长时间得不到执行而提升优先级

    目标文件

基本结构如图所示

  • 初始化的全局变量和局部静态变量保存在.data
  • 未初始化的全局变量和局部静态变量保存在.bss
  • File Header 里面包含一个段表
    除此之外还可以自定义段
    1
    2
    3
    4
    5
    6
    7
    __attribute__((section("FOO"))) int global = 42;
    __attribute__((section("BAR"))) void foo()
    {

    }
    // 这样就可以把相应的变量或者函数放在以“FOO”/"BAR"作为段名的段中
    // 名字可以自定义

C++和C的兼容

1
2
3
4
extern "C"{
int func(int);
int var;
}

C++ 编译器会将在extern “C”大括号内部的代码当作C语言来处理

为了处理C++调用了C函数,但认为是C++函数,经过名称修饰之后无法正确引用的问题,C++编译器会在便宜C++的程序时默认定义宏”__cplusplus”.我们可以使用条件宏来判断当前便宜单元是不是C++代码

1
2
3
4
5
6
7
8
#ifdef __cplusplus
extern "C"{
#endif

void *memset(void *, int, size_t); // C语言内容
#ifdef __cplusplus
}
#endif