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

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  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 會飛的兔子 閱讀(4229) 評論(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>
            欧美日韩亚洲一区二区三区| 亚洲国产日韩在线| 亚洲综合导航| 国产精品美女久久久免费| 亚洲一本视频| 亚洲一区bb| 狠狠色狠狠色综合人人| 欧美不卡在线视频| 欧美久久视频| 亚洲欧美卡通另类91av| 亚洲欧美日本视频在线观看| 国外成人免费视频| 欧美激情精品久久久久| 欧美日韩精品系列| 欧美在线二区| 亚洲欧美一区二区原创| 欧美激情网友自拍| 欧美激情国产高清| 亚洲欧美国产va在线影院| 午夜在线成人av| 在线观看欧美精品| 在线视频一区二区| 激情亚洲成人| 中日韩美女免费视频网址在线观看 | 亚洲专区一区| 影音欧美亚洲| 亚洲视频精选| 亚洲欧洲综合另类在线| 99热这里只有精品8| 国内成人精品一区| 亚洲精品视频在线| 国内精品久久久久影院薰衣草| 欧美成人精品h版在线观看| 欧美日韩性视频在线| 久久一本综合频道| 欧美视频一区二区三区| 久久青草欧美一区二区三区| 欧美日韩国产成人在线| 麻豆成人综合网| 国产精品久久久久毛片大屁完整版| 久久综合给合久久狠狠狠97色69| 欧美涩涩网站| 欧美国产日韩亚洲一区| 国产日韩亚洲欧美| 99av国产精品欲麻豆| 亚洲高清激情| 午夜视频在线观看一区二区三区| 日韩亚洲在线| 狼狼综合久久久久综合网 | 狠狠干成人综合网| 亚洲天堂视频在线观看| 日韩视频在线观看一区二区| 久久久精品国产一区二区三区| 亚洲欧美精品中文字幕在线| 欧美日本不卡视频| 亚洲高清激情| 怡红院精品视频| 久久精品女人天堂| 欧美一区亚洲一区| 国产欧美日韩综合一区在线观看| 日韩视频免费大全中文字幕| 亚洲伦理自拍| 欧美精品一区二区三区高清aⅴ| 欧美sm极限捆绑bd| 在线精品亚洲| 久久亚洲欧美国产精品乐播| 久久久亚洲人| 黑人巨大精品欧美一区二区| 久久精品欧洲| 欧美不卡一卡二卡免费版| 在线免费观看视频一区| 久久久久久午夜| 欧美二区视频| 亚洲激情网站| 欧美理论大片| 亚洲视频精品在线| 久久精品国产一区二区三区| 国产一区二区主播在线| 久久国产精品毛片| 欧美超级免费视 在线| 亚洲国产欧美一区二区三区久久 | 国产麻豆午夜三级精品| 午夜欧美大尺度福利影院在线看| 久久国产精品色婷婷| 狠狠爱成人网| 欧美电影在线观看| 亚洲午夜精品久久久久久浪潮| 欧美亚洲网站| 激情一区二区| 欧美日韩国产va另类| 亚洲欧美网站| 欧美肥婆bbw| 亚洲综合精品自拍| 伊人影院久久| 欧美色精品天天在线观看视频| 亚洲一区精品在线| 麻豆精品传媒视频| 一本在线高清不卡dvd | 欧美视频在线观看| 欧美在线观看天堂一区二区三区| 另类春色校园亚洲| 亚洲天堂成人在线观看| 国产日韩欧美制服另类| 欧美成人中文| 欧美亚洲日本网站| 亚洲片在线资源| 久久久久久色| 亚洲午夜久久久| 在线观看日韩av电影| 欧美午夜不卡| 欧美 日韩 国产 一区| 亚洲一级片在线观看| 欧美国产亚洲另类动漫| 久久国产乱子精品免费女 | 亚洲日本欧美天堂| 国产欧美精品一区| 欧美另类久久久品| 久久综合伊人77777蜜臀| 亚洲少妇自拍| 亚洲欧洲精品一区二区三区 | 在线视频亚洲| 亚洲国产成人精品女人久久久| 欧美视频一区二| 欧美精品电影| 另类激情亚洲| 久久精品一区二区三区四区 | 亚洲国产欧美精品| 久久婷婷国产综合精品青草| 亚洲欧美日韩国产另类专区| 亚洲毛片一区二区| 亚洲国产精品va在线观看黑人| 国产一区二区久久久| 欧美日韩成人综合天天影院| 美女主播一区| 老司机aⅴ在线精品导航| 欧美综合77777色婷婷| 亚洲欧美视频一区| 亚洲午夜久久久| 亚洲午夜精品网| 亚洲一区二区在线播放| 亚洲无限av看| 亚洲综合三区| 欧美一区视频| 欧美在线观看视频| 久久aⅴ乱码一区二区三区| 欧美在线观看天堂一区二区三区| 午夜在线一区| 久久成人这里只有精品| 久久成人久久爱| 久久久久久久波多野高潮日日| 久久xxxx| 玖玖玖国产精品| 欧美成人精品三级在线观看| 亚洲精品视频在线播放| 蜜桃av一区二区三区| 久久久99久久精品女同性| 欧美在线日韩| 久久一区欧美| 欧美国产精品中文字幕| 欧美国产精品久久| 日韩视频一区| 亚洲欧美亚洲| 麻豆精品精华液| 欧美日韩国产综合久久| 国产精品香蕉在线观看| 国模精品娜娜一二三区| 亚洲片国产一区一级在线观看| 亚洲人成网站在线播| 亚洲一区一卡| 久久综合九九| 日韩视频在线观看| 先锋影院在线亚洲| 欧美国产日韩xxxxx| 国产精品不卡在线| 精品69视频一区二区三区| 亚洲人成绝费网站色www| 亚洲视频国产视频| 久久九九免费| 亚洲精品美女| 欧美一级片一区| 欧美区日韩区| 国产资源精品在线观看| 日韩亚洲欧美在线观看| 久久国产精品色婷婷| 亚洲国产精品久久久久婷婷884| 在线一区日本视频| 久久综合综合久久综合| 欧美色图天堂网| 亚洲国产欧美一区| 久久精品国产精品亚洲综合| 亚洲经典自拍| 久久精品在线| 国产伦精品免费视频| 亚洲精品麻豆| 麻豆精品在线视频| 午夜日韩在线观看| 欧美日韩国产天堂| 亚洲黄色天堂| 久久一区二区三区国产精品| 亚洲视频久久|