2012-01-19 6 views
3

コード。第四パラメータ

第4パラメータthisはどのような用途ですか? thisNULLに置き換えた場合の違いは何ですか?

答えて

3

pthread_createの4番目のパラメータは、スレッド関数にそのまま渡され、その関数がその引数に基づいて動作を変更できるようにします。

OpenGroupのpthread_createの詳細については、hereを参照してください。

この場合、単に現在のオブジェクトにポインタを渡すだけです。おそらく、start関数がそれを使用して特定のオブジェクトのメンバー変数にアクセスできるようにします。

代わりにNULLを渡すと、作成されたスレッドはNULLになり、オブジェクト固有のデータにアクセスすることができなくなります(ヌルポインタの逆参照でひどくクラッシュして焼き付くことはありません)。

QThreadPrivate::startは静的関数なので、非静的メンバーにはアクセスできません(一般的には処理対象のオブジェクトがないため)。

しかし、それ

は暗黙のアクセスに適用されます - 明示 thisポインタを通じてオブジェクトデータにアクセスするからあなたを止めるものは何もありません、あなたがアクセスルールに従って提供する(例えば、個人データへのアクセスなし)。

1

4番目のパラメータは、起動時にスレッドに渡されます。 QThreadPrivate :: startは、(適切なキャストの後で)それを使用してオブジェクト固有のメンバ関数を呼び出すことができます。

3

これは一般的なイディオムです。スレッドを開始したいが、そのスレッドを特定のオブジェクトで操作したい。そのため、スレッドに操作対象のオブジェクトへのポインタを渡す必要があります。そのオブジェクトのメンバ関数内にある場合、thisポインタは、操作中のオブジェクトを指しています。型が異なるため、メンバー関数へのポインタを直接渡すことはできませんので、thisポインタを正しい型にキャストし、非静的メンバー関数を実行することを目的とする静的メンバー関数を使用します。

thisNULLに変更した場合、そのスレッドはどのオブジェクトが操作されているのか分かりません。おそらく、QThreadPrivate::startは、そのインスタンスへのポインタなしでインスタンス上で非静的メンバー関数を呼び出すことができないため、失敗または失敗します。

パラメータがなくパラメータを返さない通常のメンバ関数を持つクラスがあるとします。あなたはあなたのクラスまたはその構造について全く知らないコードをいくつか持っています。特定のクラスインスタンスでそのメンバ関数を呼び出すのに十分な情報をそのコードに与えたいとします。何を渡しますか?クラスについての知識がないため、通常のクラスメンバ関数を呼び出すことができないため、メンバ関数へのポインタを渡すことはできません。答え:これは、実装が通常のメンバ関数を呼び出す静的メンバ関数へのポインタを渡し、メソッドを呼び出すインスタンスへのポインタを渡します。

関連する問題