c++ 多线程编程
剛做完消息服務器的項目,項目是用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會意外的延長對象的生命期
對象在銷毀的時候,對象內的鎖是不會起作用的,這時候鎖很有可能已經在使用前就被銷毀了。
轉載于:https://www.cnblogs.com/captain-frank/p/5175687.html
總結
- 上一篇: 收缩 表空间
- 下一篇: Latex 数学符号表