TLS线程局部存储--thread_specific_ptr
大多數函數都不是可重入的。這也就是說在某一個線程已經調用了一個函數時,如果你再調用同一個函數,那么這樣是不安全的。一個不可重入的函數通過連續的調用來保存靜態變量或者是返回一個指向靜態數據的指針。 舉例來說,std::strtok就是不可重入的,因為它使用靜態變量來保存要被分割成符號的字符串。有兩種方法可以讓不可重用的函數變成可重用的函數。第一種方法就是改變接口,用指針或引用代替原先使用靜態數據的地方。比方說,POSIX定義了strok_r,std::strtok中的一個可重入的變量,它用一個額外的char**參數來代替靜態數據。這種方法很簡單,而且提供了可能的最佳效果。但是這樣必須改變公共接口,也就意味著必須改代碼。另一種方法不用改變公有接口,而是用本地存儲線程(thread local storage)來代替靜態數據(有時也被成為特殊線程存儲,thread-specific storage)。Boost線程庫提供了智能指針boost::thread_specific_ptr來訪問本地存儲線程。每一個線程第一次使用這個智能指針的實例時,它的初值是NULL,所以必須要先檢查這個它的只是否為空,并且為它賦值。Boost線程庫保證本地存儲線程中保存的數據會在線程結束后被清除。List5是一個使用boost::thread_specific_ptr的簡單例子。其中創建了兩個線程來初始化本地存儲線程,并有10次循環,每一次都會增加智能指針指向的值,并將其輸出到std::cout上(由于std::cout是一個共享資源,所以通過互斥體進行同步)。main線程等待這兩個線程結束后就退出。從這個例子輸出可以明白的看出每個線程都處理屬于自己的數據實例,盡管它們都是使用同一個boost::thread_specific_ptr。
#include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> #include <boost/thread/tss.hpp> #include <iostream>boost::mutex io_mutex; boost::thread_specific_ptr<int> ptr;struct count {count(int id) : id(id) { }void operator()(){if (ptr.get() == 0)ptr.reset(new int(0));for (int i = 0; i < 10; ++i){(*ptr)++;boost::mutex::scoped_locklock(io_mutex);std::cout << id << ": "<< *ptr << std::endl;}}int id; };int main(int argc, char* argv[]) {boost::thread thrd1(count(1));boost::thread thrd2(count(2));thrd1.join();thrd2.join();return 0; }?
總結
以上是生活随笔為你收集整理的TLS线程局部存储--thread_specific_ptr的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity打包失败解决方案
- 下一篇: strchr函数的用法