修改BOOST(二)

原创 2002年06月05日 10:29:00
 

修改BOOST()

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

boost提供的thread_specific_ptr用起来很简便。但是TLS的可用索引数量是有限的。特别是在的DLL中,如果第一个进程加载的DLL模块用去了n个索引,第二个进程加载相同模块时可用索引就减少n个,Windows下可用的索引也就一千个左右(我没有去查资料,只是凭记忆写的,如果有错误,可以在下面的讨论中指出,不过大概是这个意思)。不过可以只用一个TLS索引来保存所有的与线程相关的数据。下面是源代码。

1.头文件vtss.hpp

//vtss.hpp。虚拟TSS索引

#ifndef _VTSS_H

#define _VTSS_H

#include <boost/thread/tss.hpp>

 

 

namespace boost {

 

    namespace detail {

        class vtss

        {

        public:

            vtss(void (*cleanup)(void*)=0);

            ~vtss();

 

            void* get() const;

            bool set(void* value);

 

        private:

                     unsigned int key;

        };

 

    }

 

template <typename T>

class vthread_specific_ptr : private noncopyable

{

public:

    vthread_specific_ptr() : m_tss(&thread_specific_ptr<T>::cleanup) { }

 

    T* get() const { return static_cast<T*>(m_tss.get()); }

    T* operator->() const { return get(); }

    T& operator*() const { return *get(); }

    T* release() { T* temp = get(); m_tss.set(0); return temp; }

    void reset(T* p=0) { T* cur = get(); if (cur == p) return; delete cur; m_tss.set(p); }

 

private:

    static void cleanup(void* p) { delete static_cast<T*>(p); }

 

    mutable detail::vtss m_tss;

};

 

} // namespace boost

 

 

#endif

 

  2.vtss.cpp文件

#include <boost/thread/tss.hpp>

#include <boost/thread/vtss.hpp>

#include <boost/thread/mutex.hpp>

#include <map>

#include <set>

 

namespace {

 

       class cleanup_info

       {

       public:

              cleanup_info(void (*_cleanup)(void *)=0,void *_data=0)

                     :cleanup(_cleanup),data(_data){}

              ~cleanup_info(){if(cleanup && data)cleanup(data);}

              void reset(){data=0;}

              void (*cleanup)(void *);

              void *data;

       };

 

    typedef std::map<int, cleanup_info> cleanup_handlers;

 

       boost::thread_specific_ptr<cleanup_handlers> ptr_global;

 

       class tsskey

       {

              tsskey();

       public:

              static tsskey &instance();

              unsigned int alloc();

              void free(int key);

 

              boost::mutex m_lock;

              std::set<unsigned int> allkey;

              unsigned int key;

       };

 

       tsskey::tsskey():key(0)

       {

       }

 

       tsskey &tsskey::instance()

       {

              static tsskey tss;

              return tss;

       }

 

       unsigned int tsskey::alloc()

       {

              boost::mutex::scoped_lock lock(m_lock);

              while(allkey.find(++key)!=allkey.end());

              return key;

       }

 

       void tsskey::free(int key)

       {

              boost::mutex::scoped_lock lock(m_lock);

              allkey.erase(key);

       }

      

}

 

namespace boost {

 

       namespace detail {

 

              vtss::vtss(void (*cleanup)(void*))

                     :m_cleanup(cleanup)

              {

                     m_key=tsskey::instance().alloc();

              }

 

              vtss::~vtss()

              {

                     tsskey::instance().free(m_key);

              }

 

              void* vtss::get() const

              {

                     cleanup_handlers *p=ptr_global.get();

                     if(p)

                     {

                            cleanup_handlers::iterator it=p->find(m_key);

                            if(it!=p->end())

                            {

                                   return it->second.data;

                            }

                     }

                     return 0;

              }

 

              void vtss::set(void* value)

              {

                     cleanup_handlers *p=ptr_global.get();

                     if(!p)

                     {

                            p=new cleanup_handlers;

                            ptr_global.reset(p);

                     }

 

                     if(value)

                     {

                            cleanup_info info(m_cleanup, value);

                            (*p)[m_key]=info;

                            info.reset();

                     }

                     else

                     {

                            p->erase(m_key);

                     }

              }

 

       } // namespace detail

 

} // namespace boost

 

   3Vtss.hpp文件放到<boost>/boost/thread/目录下,vtss.cpp文件放到<boost>/libs/thread/src。它们的用法和原先的pthread_specific_ptr的唯一区别是多了个“v”,也就是vpthread_specific_ptr。另外,还可以将vpthread_specific_ptrprivate noncopyable去掉,这时如果你的vpthread_specific_ptr在类对象里面,则该类对象也可以互相复制。

    其次的实现是读写锁,下回吧。

property tree修改xml文件内容

#include #include #include #include #include #include #include #include void handle_monitor(std::s...
  • qq_31558353
  • qq_31558353
  • 2015年09月30日 16:33
  • 591

基于Boost方法的人脸检测(4):弱分类器生成、强分类器生成(AdaBoost)

弱分类器生成: allWeakCLF=[] for feaInd in range(data.shape[1]-1): tempD=data.iloc[:,[feaInd,-1]] tempD=...
  • mmc2015
  • mmc2015
  • 2016年04月30日 12:57
  • 681

boost 操作配置文件

#include #include //#include //#include //#include using namespace std; int main() { ptree p...
  • wangxvfeng101
  • wangxvfeng101
  • 2013年10月12日 09:50
  • 3512

基于boost的ini 文件读取/枚举/写入操作

[setting] key1=1 key2=hello 上面是ini文件的内容, 运行如下代码: void testIniParser() { using namespace boost::prop...
  • rocklee
  • rocklee
  • 2017年07月24日 15:39
  • 422

<Boost> boost::lexical_cast字面转换和gregorian::date日期

lexical_cast       用于字面值的转换,转换成int,double型,类似atoi函数。 gregorian::date       是boost里面的日期时间,使用gregorian...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月05日 15:44
  • 896

boost库之ptree的ini配置文件解析

// FirstTest.cpp : 定义控制台应用程序的入口点。 //ptree解析ini文件,get(treename, translator) :translator类型实例 #include...
  • Leeboy_Wang
  • Leeboy_Wang
  • 2015年03月02日 10:15
  • 3164

[tyvj1730二逼平衡树]解题报告

学了一下主席树,由于怕调不出来,选择了用普通线段树套权值线段树。 犯得一些傻逼错误是: ①把大小写n混用结果弄错了。 ②没过样例TM就交了。 ③被题意坑了,“保证有序序列所有值在任何时刻满足[...
  • TA201314
  • TA201314
  • 2015年03月14日 11:57
  • 460

BZOJ 3196: Tyvj 1730 二逼平衡树|线段树套平衡树

第一次写真正的树套树:线段树套平衡树?!(平衡树套线段树?!) 线段树维护的是区间,然后对于线段树维护的区间的所有数字都维护一个平衡树,然后所有的操作都对每个平衡树单独处理。 比如说操作3,需要先...
  • ws_yzy
  • ws_yzy
  • 2016年02月23日 15:18
  • 663

boost生成库的命名规则

转载于http://www.cppblog.com/Robertxiao/archive/2013/01/06/197022.html       生成文件命名规则:boost中有许多库...
  • qazwsxwtc
  • qazwsxwtc
  • 2015年11月25日 16:32
  • 882

Boost无锁队列

在开发接收转发agent时,采用了多线程的生产者-消费者模式,用了加互斥锁的方式来实现线程同步。互斥锁会阻塞线程,所以压测时,效率并不高。所以想起用无锁队列来实现,性能确实提升了。一. 用互斥锁实现单...
  • okiwilldoit
  • okiwilldoit
  • 2016年03月24日 11:42
  • 2842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改BOOST(二)
举报原因:
原因补充:

(最多只允许输入30个字)