青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

最近使用Cocos2d-x開發游戲,發現Cocos2d-x的內存管理采用Objective-C的機制,大喜過望。因為只要堅持Objective-C的原則“誰創建誰釋放,誰備份誰釋放”的原則即可確保內存使用不易出現Bug。
但是因為本身開放的游戲需要使用到多線程技術,導致測試的時候總是莫名其妙的導致空指針錯誤。而且是隨機出現,糾結了2天無果后,開始懷疑Cocos2d-X的內存本身管理可能存在問題。懷著這樣的想法,
一步一步的調試,發現經常出現指針異常的變量總是在調用autorelease后一會就莫名其妙再使用的時候就拋異常。狠下心,在它的析構函數里面斷點+Log輸出信息。發現對象被釋放了。一時也很迷糊,因為對象只是
autorelease,并沒有真正釋放,是誰導致它釋放的?

然后就去看了CCAutoreleasePool的源碼,發現存在Cocos2d-X的內存管理在多線程的情況下存在如下問題



如圖:thread 1和thread 2是獨立的兩個線程,它們之間存在CPU分配的交叉集,我們在time 1的時候push一個autorelease的自動釋放池,在該線程的末尾,即time 3的時候pop它。同理在thread 2的線程里面,在time 2的時候push一個自動釋放池,在time 4的時候釋放它,即Pop.
此時我們假設在thread 2分配得到CPU的時候有一個對象obj自動釋放,即obj-autorelease().那么在time 3的時候會發生是么事情呢?
答案很簡單,就是obj在time 3的時候就被釋放了,而我們期望它在time 4的時候才釋放。所以就導致我上面說的,在多線程下面,cocos2d-x的autorelease變量會發生莫名其妙的指針異常。


解決辦法:在PoolManager給每個線程根據pthread_t的線程id生成一個CCArray的stack的嵌套管理自動釋放池。源碼如下
所以我在Push的時候根據當前線程的pthread_t的線程id生成一個CCArray的stack來存儲該線程對應的Autoreleasepool的嵌套對象
源碼如下

   

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

//--------------------------------------------------------------------

//

// CCPoolManager

//

//--------------------------------------------------------------------


/////【diff - begin】- by layne//////


CCPoolManager* CCPoolManager::sharedPoolManager()

{

    if (s_pPoolManager == NULL)

    {

        s_pPoolManager = new CCPoolManager();

    }

    return s_pPoolManager;

}


void CCPoolManager::purgePoolManager()

{

    CC_SAFE_DELETE(s_pPoolManager);

}


CCPoolManager::CCPoolManager()

{

    //    m_pReleasePoolStack = new CCArray();   

    //    m_pReleasePoolStack->init();

    //    m_pCurReleasePool = 0;


    m_pReleasePoolMultiStack = new CCDictionary();

}


CCPoolManager::~CCPoolManager()

{


    //    finalize();


    //    // we only release the last autorelease pool here

    //    m_pCurReleasePool = 0;

    //    m_pReleasePoolStack->removeObjectAtIndex(0);

    //   

    //    CC_SAFE_DELETE(m_pReleasePoolStack);


    finalize();


    CC_SAFE_DELETE(m_pReleasePoolMultiStack);

}


void CCPoolManager::finalize()

{

    if(m_pReleasePoolMultiStack->count() > 0)

    {

        //CCAutoreleasePool* pReleasePool;

        CCObject* pkey = NULL;

        CCARRAY_FOREACH(m_pReleasePoolMultiStack->allKeys(), pkey)

        {

            if(!pkey)

                break;

            CCInteger *key = (CCInteger*)pkey;

            CCArray *poolStack = (CCArray *)m_pReleasePoolMultiStack->objectForKey(key->getValue());

            CCObject* pObj = NULL;

            CCARRAY_FOREACH(poolStack, pObj)

            {

                if(!pObj)

                    break;

                CCAutoreleasePool* pPool = (CCAutoreleasePool*)pObj;

                pPool->clear();

            }

        }

    }

}


void CCPoolManager::push()

{

    //    CCAutoreleasePool* pPool = new CCAutoreleasePool();       //ref = 1

    //    m_pCurReleasePool = pPool;

    //   

    //    m_pReleasePoolStack->addObject(pPool);                   //ref = 2

    //   

    //    pPool->release();                                       //ref = 1


    pthread_mutex_lock(&m_mutex);


    CCArray* pCurReleasePoolStack = getCurReleasePoolStack();

    CCAutoreleasePool* pPool = new CCAutoreleasePool();         //ref = 1

    pCurReleasePoolStack->addObject(pPool);                               //ref = 2

    pPool->release();                                           //ref = 1   


    pthread_mutex_unlock(&m_mutex);

}


void CCPoolManager::pop()

{

    //    if (! m_pCurReleasePool)

    //    {

    //        return;

    //    }

    //   

    //    int nCount = m_pReleasePoolStack->count();

    //   

    //    m_pCurReleasePool->clear();

    //   

    //    if(nCount > 1)

    //    {

    //        m_pReleasePoolStack->removeObjectAtIndex(nCount-1);

    //        

    //        //         if(nCount > 1)

    //        //         {

    //        //             m_pCurReleasePool = m_pReleasePoolStack->objectAtIndex(nCount - 2);

    //        //             return;

    //        //         }

    //        m_pCurReleasePool = (CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount - 2);

    //    }

    //   

    //    /*m_pCurReleasePool = NULL;*/


    pthread_mutex_lock(&m_mutex);   


    CCArray* pCurReleasePoolStack = getCurReleasePoolStack();

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool();   

    if (pCurReleasePoolStack && pCurReleasePool)

    {

        int nCount = pCurReleasePoolStack->count();


        pCurReleasePool->clear();


        if(nCount > 1)

        {

            pCurReleasePoolStack->removeObject(pCurReleasePool);

        }

    }


    pthread_mutex_unlock(&m_mutex);

}


void CCPoolManager::removeObject(CCObject* pObject)

{

    //    CCAssert(m_pCurReleasePool, "current auto release pool should not be null");

    //   

    //    m_pCurReleasePool->removeObject(pObject);


    pthread_mutex_lock(&m_mutex);

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool();

    CCAssert(pCurReleasePool, "current auto release pool should not be null");


    pCurReleasePool->removeObject(pObject);

    pthread_mutex_unlock(&m_mutex);   

}


void CCPoolManager::addObject(CCObject* pObject)

{

    //    getCurReleasePool()->addObject(pObject);


    pthread_mutex_lock(&m_mutex);   

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool(true);

    CCAssert(pCurReleasePool, "current auto release pool should not be null");


    pCurReleasePool->addObject(pObject);

    pthread_mutex_unlock(&m_mutex);     

}


CCArray* CCPoolManager::getCurReleasePoolStack()

{

    CCArray* pPoolStack = NULL;

    pthread_t tid = pthread_self();

    if(m_pReleasePoolMultiStack->count() > 0)

    {

        pPoolStack = (CCArray*)m_pReleasePoolMultiStack->objectForKey((int)tid);

    }


    if (!pPoolStack) {

        pPoolStack = new CCArray();

        m_pReleasePoolMultiStack->setObject(pPoolStack, (int)tid);

        pPoolStack->release();

    }


    return pPoolStack;

}


CCAutoreleasePool* CCPoolManager::getCurReleasePool(bool autoCreate)

{

    //    if(!m_pCurReleasePool)

    //    {

    //        push();

    //    }

    //   

    //    CCAssert(m_pCurReleasePool, "current auto release pool should not be null");

    //   

    //    return m_pCurReleasePool;


    CCAutoreleasePool* pReleasePool = NULL;



    CCArray* pPoolStack = getCurReleasePoolStack();

    if(pPoolStack->count() > 0)

    {

        pReleasePool = (CCAutoreleasePool*)pPoolStack->lastObject();

    }


    if (!pReleasePool && autoCreate) {

        CCAutoreleasePool* pPool = new CCAutoreleasePool();         //ref = 1

        pPoolStack->addObject(pPool);                               //ref = 2

        pPool->release();                                           //ref = 1


        pReleasePool = pPool;

    }


    return pReleasePool;

}


/////【diff - end】- by layne//////







轉自:http://www.ityran.com/thread-3364-1-1.html
posted on 2012-10-15 18:01 會飛的兔子 閱讀(4227) 評論(0)  編輯 收藏 引用 所屬分類: 框架/圖像/算法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩亚洲欧美精品| 国产亚洲在线观看| 亚洲毛片播放| 亚洲日韩成人| 亚洲第一中文字幕| 亚洲三级观看| 一区二区三区精密机械公司 | 久久夜色精品亚洲噜噜国产mv | 欧美日韩视频专区在线播放 | 欧美一区二区三区播放老司机 | 毛片一区二区三区| 亚洲高清不卡在线观看| 亚洲精品一区二区三区不| 一区二区三区国产精品| 久久久国产一区二区| 欧美国产日韩一二三区| 国产精品视频免费| 欧美激情第五页| 亚洲电影网站| 亚洲色诱最新| 久久久久久久久久码影片| 激情综合电影网| 国内精品美女在线观看| 国产性做久久久久久| 日韩视频一区二区三区在线播放| 亚洲欧美电影在线观看| 欧美大片免费| 亚洲一区二区三区国产| 美国成人直播| 国外成人网址| 亚洲欧美中日韩| 欧美激情亚洲激情| 欧美一级视频一区二区| 欧美日韩在线电影| 亚洲国产欧美一区| 久久久亚洲影院你懂的| 亚洲视频精选在线| 欧美精品一区在线发布| 影音国产精品| 久久久久久网站| 亚洲一区二区免费看| 欧美日韩黄视频| 亚洲免费观看高清完整版在线观看熊| 久久久久欧美精品| 亚洲欧美日本国产专区一区| 欧美日韩国产免费观看| 亚洲欧洲精品一区二区三区| 久久综合色婷婷| 欧美中文字幕不卡| 国产伦理一区| 亚洲小视频在线| 99国产精品久久久久久久成人热| 欧美r片在线| 亚洲国产精品国自产拍av秋霞| 久久激情综合网| 亚洲欧美日韩国产中文| 国产精品美女在线| 午夜精品影院| 亚洲性线免费观看视频成熟| 欧美日韩一级大片网址| 日韩一级免费| 日韩一区二区免费看| 欧美日韩国产一级| 亚洲一区三区电影在线观看| 在线亚洲免费视频| 国产精品实拍| 久久久久一区| 免费不卡亚洲欧美| 一区二区精品国产| 中文日韩电影网站| 国产一区二区三区高清播放| 久久久久成人网| 久久久精品动漫| 亚洲精品男同| 亚洲午夜av在线| 麻豆国产精品va在线观看不卡| 欧美伊久线香蕉线新在线| 国产一区二区三区免费在线观看| 久久久久国色av免费看影院| 久久久精品国产一区二区三区| 亚洲国产精品精华液2区45 | 香蕉久久夜色精品| 黄色成人av网站| 亚洲国产小视频在线观看| 欧美激情自拍| 欧美一区二区大片| 麻豆乱码国产一区二区三区| 一区二区欧美日韩| 久久国产精品99国产| 日韩网站免费观看| 午夜精彩视频在线观看不卡 | 欧美中日韩免费视频| 久久婷婷av| 亚洲一区二区在| 久久综合网络一区二区| 亚洲最黄网站| 久久激情五月丁香伊人| 中国亚洲黄色| 久久久久久午夜| 亚洲女人小视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲一区精品视频| 亚洲福利免费| 亚洲中字在线| 亚洲美女在线一区| 久久国产视频网| 亚洲一区在线免费观看| 久久久噜噜噜久久中文字幕色伊伊| 一本色道久久精品| 久久久久久久久久久久久9999| 亚洲视频在线观看一区| 久久一区二区三区av| 午夜亚洲视频| 欧美日韩综合精品| 91久久久国产精品| 在线欧美日韩国产| 亚洲精品乱码久久久久久久久| 午夜免费久久久久| 亚洲视频一区在线观看| 欧美成人dvd在线视频| 久久婷婷成人综合色| 国产精品久久久久久久久久免费看 | 国产视频一区免费看| 91久久精品美女| 在线国产精品播放| 欧美在线黄色| 久久国产精品久久国产精品| 欧美色中文字幕| 日韩亚洲欧美中文三级| 亚洲精品一区二区三区福利| 国产精品永久免费观看| 久久久激情视频| 国产精品欧美久久| 亚洲精品一区二区三区av| 国产精品美女久久久久久久| 久久九九国产精品| 午夜免费日韩视频| 久久最新视频| 亚洲国产你懂的| 一本色道**综合亚洲精品蜜桃冫| 欧美成人午夜激情| 亚洲日韩视频| 在线亚洲自拍| 国产精品卡一卡二| 亚洲一区免费视频| 欧美中文字幕视频在线观看| 国产欧美精品| 久久精品免费看| 欧美激情a∨在线视频播放| 亚洲伦理久久| 欧美性理论片在线观看片免费| 一区二区三区欧美激情| 亚洲欧美日韩综合国产aⅴ| 国产美女精品| 另类国产ts人妖高潮视频| 亚洲国产精品成人久久综合一区| 亚洲精品一二| 国产精品每日更新| 久久国产手机看片| 亚洲福利视频专区| 亚洲嫩草精品久久| 黄色成人免费网站| 欧美精品日韩一区| 午夜精品久久久久久久久 | 亚洲精品资源| 香蕉亚洲视频| 一区二区在线观看av| 欧美激情视频给我| 欧美亚洲一级片| 亚洲国产欧美在线| 欧美一区二区三区成人| 亚洲国产精品精华液网站| 国产精品进线69影院| 久久露脸国产精品| 一区二区三区蜜桃网| 免费国产一区二区| 亚洲天堂成人在线观看| 伊人久久大香线蕉av超碰演员| 欧美区高清在线| 久久精品成人| 亚洲性感激情| 亚洲国产小视频| 久久婷婷蜜乳一本欲蜜臀| 亚洲色图在线视频| 亚洲国产精品一区二区三区| 国产精品一区二区三区四区| 欧美韩国在线| 久久嫩草精品久久久精品一| 亚洲视频大全| 日韩视频中文字幕| 欧美国产91| 蜜桃av一区| 久久精品国产77777蜜臀| 一区二区三区国产盗摄| 亚洲国产日韩欧美在线99 | 欧美久久久久久蜜桃| 久久久蜜桃精品| 欧美影院午夜播放| 国产精品日韩欧美大师| 久久一区精品|