LoginSignup
24
23

More than 5 years have passed since last update.

cocos2d-xの参照カウンタが、スレッドフリーでない疑惑

Posted at
CCRef.cpp
void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
++_referenceCount;
}

class Ref は、cocos2d-xのメモリ管理、retain、releaseをする基底クラスで
Node等 ほとんどのクラスは、ここから派生していますが
この参照カウンタでは、マルチスレッド環境にて不具合が発生するので
ミューテックス、あるいはロックフリーで、スレッドセーフにする必要があります

今回はパフォーマンス的に ロックフリーが妥当で、さほどパフォーマンスに影響でないと思いますので
下記のように アトミック操作を使い ロックフリーを実現したいと思います

CCRef.cpp
++_referenceCount;
--_referenceCount;

__sync_add_and_fetch(&_referenceCount, 1);
__sync_add_and_fetch(&_referenceCount, -1);

こう変更すれば、だいたいスレッドフリーになるのではないでしょうか。

現在 PullRequest してますが Jenkins設定がおかしくなってるのか
しばらくビルドが出来てないようで
PRトオレバイイナ・・・

ちなみに、上記 class Refは、Appleのcocosライブラリの模倣で
C++としては 許しがたいコード (標準のスマートポインタ shared_ptrあるのに使わない)
なので、はやくshared_ptr に修正して欲しいな・・・

もちろん shared_ptrは アトミック操作をし、スレッドフリーになってますし
release せずとも、スコープ外で自動的に参照カウンタをデクリメントするので
使い勝手も良いです

あと、Refだと STLコンテナに入れ辛いため(vector::remove 時に参照カウンタがデクリメントされず リークする)
cocos2d-xでは cocos2d::Vector を作って、pushBack、remove時に retain、release を呼んでますね・・・
全然標準じゃない!!

はやく cocoaライブラリ色を完全に除去し、C++として標準的なコードになってほしいですね。

24
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
23