[读书笔记]程序员的自我修养(1)

本文探讨了计算机科学中并发编程的基本概念,包括线程优先级的调节方法、不可抢占线程放弃执行的情况、可重入函数的特点及volatile关键字的作用,并介绍了C++中new操作符的工作原理。

第一章 温故而知新

1.阅读“Free Lunch is Over”         http://www.gotw.ca/publications/concurrency-ddj.htm

2."Any problem in computer science can be solved by another layer of indirection."
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

3.线程优先级改变的三种方式:
用户指定优先级
根据进入等待状态的频繁程度提升或者降低优先级
长时间得不到执行而被提升优先级(防饿死)

4.不可抢占线程放弃执行的两种情况
当线程试图等待某事件(IO等) (进入等待状态)
线程主动放弃时间片

5.可重入函数:
不使用任何(局部)静态或全局的非const变量
不返回任何(局部)静态或全局的非const变量的指针
仅依赖于调用方提供的参数
不依赖任何单个资源的锁(mutex等)
不调用任何不可重入函数

6.volatile基本上可以做两件事
阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回
阻止编译器调整操作volatile变量的指令顺序

7.c++new的两个步骤:分配内存;调用构造函数
// Singleton《设计模式:可复用面向对象软件基础》
volatile T* pInst=0;
T* GetInstance()
{
// 双层if让lock的开销降低到最小
if (pInst==NULL)
{
   lock();
   if(pInst==NULL)
    /*
    1.分配内存
    2.在内存的位置上调用构造函数
    3.将内存的地址赋值给pInst
    */
    pInst=new T;
    /*
    上面第2,3步顺序可以颠倒,也就是说
    pInst的值已经不是NULL,但对象仍然没有构造完毕,这时另一个GetInstance的并发调用此时第一个if里为false
    这时就会范围尚未构造完全的对象地址pInst以提供给用户使用
    */
   unlock();
}
return pInst;
}

/* 阻止换序:可以加barrier指令阻止CPU将该指令之前的指令交换到barrier之后。
    T* tenp=new T;
    barrier();
    pInst=tenp;
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值