VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 144|回复: 0

[交流] WINDOWS TLS

[复制链接]
38_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-6 05:34:59 | 显示全部楼层 |阅读模式
本帖最后由 SO平凡 于 2020-4-6 05:38 编辑

class CSimpleList
{
public:
    CSimpleList(int nNextOffset=0);
    void Construct(int nNextOffset);
    void Construct_Data(int NextDataOffset);
//----------------函数给用户的接口函数---------//
    bool IsEmpty()const;
    void  AddHead(void*p);
    void  RemoveAll();
    void*GetHead()const;
    void*GetNext(void*p)const;
    bool  Remove(void*p);
    void  ShowAll(void*p);
  //-------------------------------------------------
    //*函数接口所需的成员
    void*  m_phead;
    size_t  m_nNextOffset;//数据结构中的PNEXT的偏移量
    size_t  m_nDataOffset;
    void**GetNextprt(void*p)const;//取得数据结构PNEXT
    void**GetData(void*p)const;


};
  //---------------类内联---------------------------------
  inline CSimpleList::CSimpleList(int nNextOffset)
  {m_phead=NULL;m_nNextOffset=nNextOffset;}
  //*********************************************
  inline void CSimpleList::Construct(int nNextOffset)
  {m_nNextOffset=nNextOffset;}
  //***********************************************
  inline void CSimpleList::Construct_Data(int DataOffset)
  {m_nDataOffset=DataOffset;}
  //**********************************************
  inline bool CSimpleList::IsEmpty()const
  {return m_phead==NULL;}
  //**********************************************
  inline void CSimpleList::RemoveAll()
  {m_phead=NULL;}
  //**********************************************
  inline void *CSimpleList::GetHead()const
  {return  m_phead;};
//***********************************************
  inline void *CSimpleList::GetNext(void*preElement)const
  {return *GetNextprt(preElement);}
  //*************************************************
  inline void** CSimpleList::GetNextprt(void*p)const
  {return (void**)(BYTE*)p+m_nNextOffset;}
  //*************************************************
  inline void** CSimpleList::GetData(void*p)const
  {return (void**)(BYTE*)p+m_nDataOffset;}
//----实现函数----------------------------------------------------
void CSimpleList::AddHead(void*p)
{
     *GetNextprt(p)=m_phead;  //倒装链表
     m_phead=p;
}
//---------------------------------------------------------------
bool CSimpleList::Remove(void*p)
{
    if(p==NULL)
        return false;
    bool bRsult=false;
    if(p==m_phead)//移除的是头元素
    {
        m_phead=*GetNextprt(p);
        bRsult=true;
    }
    else{
        void*pTest=m_phead;//--从头元素查找--
        while(pTest!=NULL&&*GetNextprt(pTest)!=p)
        pTest=*GetNextprt(pTest);
        if(pTest!=NULL){
            *GetNextprt(pTest)=*GetNextprt(p);
            bRsult=true;
        }
    }
    return bRsult;
}
//-------------------------------------------------------------
void CSimpleList::ShowAll(void*p)
{
    if(p==NULL)
        cout<<"line is NULL"<<endl;
    while(*GetNextprt(p)!=NULL)
    {
        cout<<(DWORD_PTR)*GetData(p)<<endl;
        p=*GetNextprt(p);
    }
       p=*GetNextprt(p);
       cout<<(DWORD_PTR)*GetData(p)<<endl;
}
//----------------------------------------------------------
template<class TYPE>
class CTypedSimpleList:public CSimpleList
{
public:
    CTypedSimpleList(int nNextOffset=0)
          :CSimpleList(nNextOffset){}
     void AddHead(TYPE p)
     {
         CSimpleList::AddHead((void*)p);}
     TYPE GetHead()
     {return (TYPE)CSimpleList::GetHead();}
     TYPE GetNext(TYPE p)
     {return (TYPE)CSimpleList::GetNext(p);}
     bool Remove(TYPE p)
     {return CSimpleList::Remove(p);}
     operator TYPE()
     {return (TYPE)CSimpleList::GetHead();}
};
CTypedSimpleList<CThreadData>m_list;
void CThreadSloData::SetValue(int nSlot,void*pValue)
{
    CThreadData*pData=(CThreadData*)::TlsGetValue(m_tlslndex);
    if((pData==NULL||nSlot>=pData->nCount)&&pValue!=NULL)
    {
        //pData的值为空,表示这线程是第一次访问线程私有数据
        if(pData==NULL)
        {
            pData=new CThreadData;
            pData->nCount=0;
            pData->pData=NULL;
            //把新申请的内存的地址加入到全局列表中
            ::EnterCriticalSection(&m_cs);
            m_list.AddHead(*pData);
            ::LeaveCriticalSection(&m_cs);
        }
void AddHead(TYPE p)
     {
         CSimpleList::AddHead((void*)p);}这个函数 无法转化CThreadData 无法通过编译,如果改了 CSimpleList::AddHead(&p);
可以通过
但是 operator TYPE()
     {return (TYPE)CSimpleList::GetHead();} 这里又不能通过了 又是无法转换TYPE 类 有大佬 帮我一下吗?多谢了





上一篇:deepin系统下C++编程系列(科普,非精通)5.4补充:mysql字符集问题
下一篇:学习SpiderMonkey60的心得笔记(十)JavaScript的模块module实现
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-8-12 23:44

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表