shared_ptr實現多執行緒讀寫copy-on-write
利用boost的shared_ptr可以實現“讀不阻塞寫”。過程中每次讀取不需要複製資料,而只需要在要寫的時候複製一份資料:
點選(此處)摺疊或開啟
點選(此處)摺疊或開啟
-
#include <iostream>
-
#include <cstdlib>
-
#include <map>
-
#include <vector>
-
#include <boost/smart_ptr.hpp>
-
#include <boost/make_shared.hpp>
-
#include <boost/enable_shared_from_this.hpp>
-
#include <boost/bind.hpp>
-
#include <boost/function.hpp>
-
#include <boost/noncopyable.hpp>
-
-
#include <pthread.h>
-
#include <unistd.h>
-
-
using namespace std;
-
-
-
class mutex_lock: public boost::noncopyable
-
{
-
public:
-
mutex_lock(){pthread_mutex_init(&_mutex, NULL);}
-
~mutex_lock(){pthread_mutex_destroy(&_mutex);}
-
void lock() {pthread_mutex_lock(&_mutex);}
-
void unlock() {pthread_mutex_unlock(&_mutex);}
-
private:
-
pthread_mutex_t _mutex;
-
};
-
-
class mutex_locker: public boost::noncopyable
-
{
-
public:
-
explicit mutex_locker(mutex_lock& lk): _lk(lk){_lk.lock();}
-
~mutex_locker(){_lk.unlock();}
-
private:
-
mutex_lock& _lk;
-
};
-
-
-
// 負責都和寫的物件
-
class rwobj
-
{
-
public:
-
rwobj(){sp_data = boost::make_shared<vector<int> >();}
-
void read_data()
-
{
-
boost::shared_ptr<vector<int> > sp;
-
{
-
cout << "--------------------- read wait" << endl;
-
mutex_locker lk(l); // 臨界區足夠小,適合用mutex。
-
sp = sp_data; // 利用區域性的shared_ptr來增加資料的引用計數,告訴寫執行緒不要修改這份資料
-
cout << "read sleep 1" << endl;
-
sleep(1); // 為了阻塞其它執行緒
-
}
-
-
cout << "read size " << sp->size() << endl;
-
cout << "read sleep 2" << endl;
-
sleep(2);
-
}
-
-
void write_data(int i)
-
{
-
{
-
cout << "------------------------------ write wait" << endl;
-
mutex_locker lk(l); // 寫執行緒的臨界區比較大
-
if(!sp_data.unique())
-
{
-
// 如果sp_data引用計數大於1,說明有其他執行緒在讀(透過read_data()提升了引用計數)。
-
// 此時將資料複製一份,再利用reset或者swap讓sp_data指向新資料,老資料讓讀執行緒繼續讀。
-
// 這個寫執行緒現在獨佔了sp_data,而之前那份資料在所有讀執行緒讀完之後,引用計數會變成0,被最後一個讀執行緒自動析構。
-
sp_data.reset(new vector<int>(*sp_data));
-
cout << "-------------------------------- copy on write" << endl;
-
}
-
sp_data->push_back(i);
-
}
-
cout << "sleep write" << endl;
-
sleep(1);
-
}
-
private:
-
boost::shared_ptr<vector<int> > sp_data;
-
mutex_lock l;
-
};
-
-
-
rwobj obj;
-
-
// 讀執行緒
-
void* read_thread(void* arg)
-
{
-
while(1)
-
{
-
obj.read_data();
-
}
-
}
-
-
寫執行緒
-
void* write_thread(void* arg)
-
{
-
int i = 1;
-
while(1)
-
{
-
obj.write_data(i++);
-
}
-
}
-
-
int main()
-
{
-
pthread_t thread1,thread2, thread3;
-
pthread_create(&thread1, NULL, &read_thread, NULL );
-
pthread_create(&thread2, NULL, &read_thread, NULL );
-
pthread_create(&thread3, NULL, &write_thread, NULL );
-
pthread_join(thread1,NULL);
-
pthread_join(thread2,NULL);
-
pthread_join(thread3,NULL);
-
return 0;
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26239116/viewspace-2125592/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒與併發----讀寫鎖執行緒
- 如何實現多執行緒執行緒
- 多執行緒實現多工二執行緒
- 多執行緒實現多工一執行緒
- 【unity】 Loom實現多執行緒UnityOOM執行緒
- JavaScript如何實現多執行緒?JavaScript執行緒
- Java多執行緒實現方式Java執行緒
- 多執行緒具體實現執行緒
- Runnable介面實現多執行緒執行緒
- Java多執行緒的實現Java執行緒
- 【連載 02】多執行緒實現執行緒
- 多執行緒爬蟲實現(上)執行緒爬蟲
- 用Pthread實現多執行緒操作thread執行緒
- Python簡單實現多執行緒例子Python執行緒
- 【QT】QtConcurrent::run()+QThreadPool實現多執行緒QTthread執行緒
- Java多執行緒【三種實現方法】Java執行緒
- 純Mutex實現多執行緒交替列印Mutex執行緒
- 用多執行緒,實現併發,TCP執行緒TCP
- 多執行緒伺服器的實現執行緒伺服器
- 多執行緒基礎-基礎實現執行緒
- 面試-實現多執行緒的方式面試執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- 多執行緒系列(十一) -淺析併發讀寫鎖StampedLock執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- Java多執行緒001——一圖讀懂執行緒與程式Java執行緒
- 多執行緒和多執行緒同步執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 手寫執行緒池,對照學習ThreadPoolExecutor執行緒池實現原理!執行緒thread
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒之守護執行緒實戰Java執行緒
- 代理ip 多執行緒 python寫法執行緒Python
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- Python實現投遞多執行緒任務Python執行緒
- Java實現多執行緒的三種方式Java執行緒
- 【QT】子類化QThread實現多執行緒QTthread執行緒