【ハルシオンブログ】デリゲートに格納されたメソッドをスレッドセーフに呼ぶ方法?
こんにちは。坂内っす。
UnityでC#書いてる時にデリゲート使ってますか?
デリゲートクラスがNullになってしまいエラーが出たりってことありませんか?
そんな時はスレッドセーフな書き方があるらしいです。
スレッドセーフとはなんぞや?
「スレッドセーフ(Thread-safe)は、マルチスレッドプログラミングにおける概念である。あるコードがスレッドセーフであるという場合、そのコードを複数のスレッドが同時並行的に実行しても問題が発生しないことを意味する。特に、ある共有データへの複数のスレッドによるアクセスがあるとき、一度に1つのスレッドのみがその共有データにアクセスするようにして安全性を確保しなければならない。」
Wikiより
だそうです。
こんなコードを書いた時、TestBのほうがスレッドセーフらしいですよ。
[Blog20220606.cs]
もちろんTestAの方でもnullの判定はしているので動きます。エラーはでません。
Delegateは非同期処理とかでよく使われたりするということで、TestAのcallback()の時点でcallbackがnullになった場合(ifの後で)NullPointerExceptionが出てしまう可能性があるらしいです。
そこでTestBのように 「callback?.Invoke()」という形にするとスレッドセーフになるようです。
メモ程度ですが、デリゲートのスレッドセーフな実行方法についてでした。
では、あでゅ~ノシ
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)
« 【ハルシオンブログ】同じ文字列を連続してつなげたいとき | 【ハルシオンブログ】ゲームオブジェクトかつアクティブでコンポーネントが有効かの確認 »
コメント
| h o m e |