スレッドの制御

ここで説明する関数やマクロは,主に多重スレッドビルド (wxUSE_THREADS = 1) でも,単一スレッドの設定 (wxUSE_THREADS =0) でもコンパイルできるコードをかけるよう にします.

例えば,前者の場合,静的変数は複数のスレッド間で同時にアクセスされないよう 保護せねばなりませんが,後者の場合にはそうしたクリティカルセクションの 使用による余計なオーバヘッドは必要ありません.こうした問題を解決する ために,wxCRITICAL_SECTION を使って 必要なときにだけクリティカルセクションを作成できます.

Include files

<wx/thread.h>

See also

wxThread, wxMutex, マルチスレッドの概要



wxCRIT_SECT_DECLARE



wxCRIT_SECT_DECLARE( cs)

wxUSE_THREADS が 1 の場合には (静的な) クリティカルセクション オブジェクトcs を宣言し,0 の場合には何もしません.



wxCRIT_SECT_DECLARE_MEMBER



wxCRIT_SECT_DECLARE( cs)

wxUSE_THREADS が 1 の場合にはクリティカルセクション オブジェクトcs を宣言し,0 の場合には何もしません. (wxCRIT_SECT_DECLARE とは違って) static キーワードを持たないので,クラスや構造体のメンバに 適用できます.



wxCRIT_SECT_LOCKER



wxCRIT_SECT_LOCKER( name, cs)

wxUSE_THREADS が 1 の場合には クリティカルセクションロック オブジェクト name を作成し,クリティカルセクションcs と関連付けます.0 の場合には何もしません.



wxCRITICAL_SECTION



wxCRITICAL_SECTION( name)

wxCRIT_SECT_DECLAREwxCRIT_SECT_LOCKER を組み合わせたものです: 静的なクリティカルセクションオブジェクトと,それに関連付けられた ロックオブジェクトを作成します.従って,このマクロは関数の中でのみ 利用でき,グローバルスコープでは利用できません.例えば:

int IncCount()
{
    static int s_counter = 0;

    wxCRITICAL_SECTION(counter);

    return ++s_counter;
}

(ここでは,この関数を主スレッドで最初に呼び出し,他のスレッドがこの 関数を呼び出す前にクリティカルセクションオブジェクトの作成を正しく 行っているものと仮定しています.そのようなケースに当てはまらなければ, 上のようなアプローチを使っては ならず,クリティカルセクションを グローバル内で生成せねばなりません.



wxENTER_CRIT_SECT



wxENTER_CRIT_SECT(wxCriticalSection& cs)

wxUSE_THREADS が 1 の場合には cs.Enter() と同じで,0 の場合には 何もしません.



::wxIsMainThread



bool wxIsMainThread(void)

スレッドが主スレッドの場合には true を返します. wxUSE_THREADS が 0 の場合には常に true を返します.



wxLEAVE_CRIT_SECT



wxLEAVE_CRIT_SECT(wxCriticalSection& cs)

wxUSE_THREADS が 1 の場合には cs.Enter() と同じで,0 の場合には 何もしません.



::wxMutexGuiEnter



void wxMutexGuiEnter(void)

メインの GUI スレッド以外のスレッドが GUI ライブラリにアクセスするより も前に呼び出さねばなりません.この関数は,主スレッド (またはメイン GUI に対するロックを保持している他のスレッド) が GUI ライブラリの 処理から離れるまで呼び出し側のスレッドの実行をブロックし,呼び出し側の スレッドが::wxMutexGuiLeave() を呼び出すまで, 他のスレッドが GUI ライブラリ内の処理に入らないようにします.

この関数の典型的な使い方は以下のようになります:

void MyThread::Foo(void)
{
    // GUI 呼び出しを行う前に,このスレッドだけが呼び出しを行えるよう
    // 保障しておく必要があります!

    wxMutexGuiEnter();

    // GUI の呼び出しを行います:
    my_window->DrawSomething();

    wxMutexGuiLeave();
}

GTK 下では,主スレッド以外のスレッドはトップレベルウィンドウを 生成できないので注意してください.

この関数はプリエンプティブスレッドをサポートするプラットフォーム上でのみ 定義されています.



::wxMutexGuiLeave



void wxMutexGuiLeave(void)

::wxMutexGuiEnter() を参照してください.

この関数はプリエンプティブスレッドをサポートするプラットフォーム上でのみ 定義されています.

ymasuda 平成17年11月19日