标签:
刚做完消息服务器的项目,项目是用c++开发的,没有引入现在c++的特性向智能指针,bind/function等。当时在开发的时候对其中一个bug印象比较深,bug原因是在session对象释放后,在其他地方继续的被使用。
对于临界资源加锁处理。对于多个线程共享的对象通过使
1. 有过多线程编程经验的都知道多线程编程最基本的就是通过加锁实现对临界资源的安全读写。
实现局部锁
class MutexLock : boost::noncopyable { public: MutexLock() { pthread_mutex_init(&mutex_, NULL); } ~MutexLock() { pthread_mutex_destroy(&mutex_); } void lock() { pthread_mutex_lock(&mutex_); } void unlock() { pthread_mutex_unlock(&mutex_); } private: pthread_mutex_t mutex_; }; class MutexLockGuard : boost::noncopyable { public: explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex) { mutex_.lock(); } ~MutexLockGuard() { mutex_.unlock(); } private: MutexLock& mutex_; }
2. 对象构造的时候做到线程安全
(1) 不要在构造函数内注册回调函数
(2) 不要在构造函数中把this传给跨线程的对象
(3) 即便在构造函数的最后一行也不行,因为如果这个类是基类,则初始化完基类后还要初始化派生类。
因为在构造函数执行期间对象还没有初始化完成,在此时将this传给跨线程的对象,那个对象访问的将可能是一个没有初始化完全的半成品。
3. 对象在析构时
资源在A线程正在被使用,却在B线程被释放。就会造成A线程访问了无效的资源。解决这个问题的方法是在使用前判断资源是否有效。使用工具weak_ptr和shared_ptr
shared_ptr本身不是线程安全的,多线程安全的使用shared_ptr需要加锁。
shared_ptr会意外的延长对象的生命期
对象在销毁的时候,对象内的锁是不会起作用的,这时候锁很有可能已经在使用前就被销毁了。
标签:
原文地址:http://www.cnblogs.com/captain-frank/p/5175687.html