学习 muduo。

记录其中不懂然后弄懂的知识。。大部分知识皆是转载博客。
1、RAII手法。(resource acquisition is initialization(资源获取就是初始化))

template 
class LockGuard
{
public:
    explicit LockGuard(Mutex& m)
        : m_(m)
    {
        m_.Lock();
    }

    ~LockGuard()
    {
        m_.Unlock();
    }

private:
    LockGuard(const LockGuard&);
    LockGuard& operator=(const LockGuard&);
    Mutex& m_;
};

锁的获取就是初始化一个对象,在构造函数中获取锁,锁的释放也是在该对象的析构函数中释放。。这种通用技术依赖于构造函数和析构函数的性质以及它们与异常处理的交互作用。

2、scoped locking(区域锁)
区域锁就是把锁封装到一个对象里面。锁的初始化放到构造函数,锁的释放放到析构函数。这样当锁离开作用域时,析构函数会自动释放锁。即使运行时抛出异常,由于析构函数仍然会自动运行,所以锁仍然能自动释放。
一个典型的区域锁:

class Thread_Mutex_Guard 
{
public:
    Thread_Mutex_Guard (Thread_Mutex &lock)
    : lock_ (&lock) 
    { 
        // 如果加锁失败,则返回-1
        owner_= lock_->lock(); 
    }

    ~Thread_Mutex_Guard (void) 
    {
        // 如果锁获取失败,就不释放
        if (owner_ != -1)
            lock_->unlock ();
    }
private:
    Thread_Mutex *lock_;
    int owner_;
};

3、智能指针。(解决对象的销毁问题)
优点:(在陈硕muduo书的p14页)
①shared_ptr控制对象的生命期
②weak_ptr不控制对象的生命期,但它知道对象是否还活着
③shared_ptr/weak_ptr的计数在主流平台上是原子操作(!!!)

智能指针的具体使用:http://blog.csdn.net/xt_xiaotian/article/details/5714477

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。所有智能指针都重载了“operator->”操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用“.”操作符。
访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指针是否为空,需要这样判断:if (my_smart_object.get())。
智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。

4、std::map 重载[]
在阅读p21页中的代码时候对

weak_ptr& wkStock = stocks_[key];

查找相关资料。

T& operator[] ( const key_type& x );
(*((this->insert(make_pair(x,T()))).first)).second

你可能感兴趣的:(muduo,C/C++)