目次 - API(機能別) - アトミック操作 - SDL_atomic_t

SDL_atomic_t

アトミック整数値を表す構造体

フィールド

intvalueアトミック整数値

サンプルコード

/* これはFPSをカウントするサンプルである
 *
 * SDLタイマは別のスレッドで動いている
 * そのためデータ競合を防ぐ必要である
 */
SDL_atomic_t frames;

/* 設定された間隔で平均フレームレートの計算と表示を行う */
Uint32 fps_timer_callback(Uint32 interval, void *data)
{
        const float f = SDL_AtomicGet(&frames);
        const float iv = interval * 0.001f;

        /* 注意: printfがスレッドセーフであるかは環境に依存する */
        printf("%.2f\tfps\n", f / iv);

        /* フレームカウンタをリセットする */
        SDL_AtomicSet(&frames, 0);

        return interval;
}

int main(int argc, char **argv)
{
        SDL_Init(SDL_INIT_EVERYTHING);
        SDL_Window *win = SDL_CreateWindow("Counter",
                        SDL_WINDOWPOS_CENTERED,
                        SDL_WINDOWPOS_CENTERED,
                        640,
                        480,
                        0
                        );

        SDL_Surface *screen = SDL_GetWindowSurface(win);

        /* タイマは別スレッドで5秒間隔で動く */
        SDL_AddTimer(5000, fps_timer_callback, NULL);

        SDL_Event e;
        while(1) {
                while (SDL_PollEvent(&e)) {
                        if (e.type == SDL_QUIT) {
                                goto quit;
                        }
                }
                SDL_FillRect(screen, NULL, 0xffffffff);
                SDL_UpdateWindowSurface(win);

                /* フレーム数に1を加える */
                SDL_AtomicAdd(&frames, 1);
        }
quit:
        SDL_DestroyWindow(win);
        SDL_Quit();
        return 0;
}

詳細

SDL_atomic_tは構造体なので間違って演算子で操作することがない. アトミック操作関数では整数の値としてこれを使う必要がある.

関連項目(関数)

SDL_AtomicAdd
SDL_AtomicCAS
SDL_AtomicDecRef
SDL_AtomicGet
SDL_AtomicIncRef
SDL_AtomicSet

SDL Wikiへのリンク

SDL_atomic_t - SDL Wiki