FC2ブログ
    04 «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.» 06

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】デリゲートに格納されたメソッドをスレッドセーフに呼ぶ方法? 

    こんにちは。坂内っす。

    UnityでC#書いてる時にデリゲート使ってますか?
    デリゲートクラスがNullになってしまいエラーが出たりってことありませんか?

    そんな時はスレッドセーフな書き方があるらしいです。

    スレッドセーフとはなんぞや?
    「スレッドセーフ(Thread-safe)は、マルチスレッドプログラミングにおける概念である。あるコードがスレッドセーフであるという場合、そのコードを複数のスレッドが同時並行的に実行しても問題が発生しないことを意味する。特に、ある共有データへの複数のスレッドによるアクセスがあるとき、一度に1つのスレッドのみがその共有データにアクセスするようにして安全性を確保しなければならない。」

    Wikiより


    だそうです。

    こんなコードを書いた時、TestBのほうがスレッドセーフらしいですよ。

    [Blog20220606.cs]

    using UnityEngine;

    public class Blog20220606 : MonoBehaviour
    {

    public delegate void Callback();

    void Start()
    {
    TestA(ShowHello);
    TestB(ShowHello);
    TestA(null);
    TestB(null);
    }

    void ShowHello() {
    Debug.Log("Hello!!");
    }

    static void TestA(Callback callback) {
    Debug.Log("TestA");
    if (callback != null) {
    callback();
    }
    }
    static void TestB(Callback callback) {
    Debug.Log("TestB");
    callback?.Invoke();
    }
    }



    もちろんTestAの方でもnullの判定はしているので動きます。エラーはでません。

    Delegateは非同期処理とかでよく使われたりするということで、TestAのcallback()の時点でcallbackがnullになった場合(ifの後で)NullPointerExceptionが出てしまう可能性があるらしいです。
    そこでTestBのように 「callback?.Invoke()」という形にするとスレッドセーフになるようです。

    メモ程度ですが、デリゲートのスレッドセーフな実行方法についてでした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/893-a94f418d
    この記事にトラックバックする(FC2ブログユーザー)