Введение в Simple DirectMedia Layer

       

Потоки


  • Создание простого потока
  • Создание потока делается через вызов функции SDL_CreateThread(). После успешного возврата из функции ваша функция теперь запущена одновременно с основным приложением в своем контексте задачи (стек, регистры и прочее) и может получать доступ к памяти и открытым файлам используемыми в основном приложении. 

    Совет:

    Второй аргумент для SDL_CreateThread() передается как параметр для  порожденного потока. Вы можете использовать его для передачи значений в стек или только как указатель на данные, которые будут использоваться в потоке.



    Пример:

    #include "SDL_thread.h" int global_data = 0; int thread_func(void *unused){    int last_value = 0;     while ( global_data != -1 ) {        if ( global_data != last_value ) {            printf("Data value changed to %d\n", global_data);            last_value = global_data;        }        SDL_Delay(100);    }    printf("Thread quitting\n");    return(0);} {    SDL_Thread *thread;    int i;     thread = SDL_CreateThread(thread_func, NULL);    if ( thread == NULL ) {        fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());        return;    }     for ( i=0; i<5; ++i ) {        printf("Changing value to %d\n", i);        global_data = i;        SDL_Delay(1000);    }     printf("Signaling thread to quit\n");    global_data = -1;    SDL_WaitThread(thread, NULL);}

    <
  • Синхронизация доступа к ресурсу


  • Вы можете предотвращать доступ к ресурсу более чем из одного потока с помощью создания семафора и получать доступ к ресурсу, окружая доступ вызовом блокировки (SDL_mutexP()) и разблокировки (SDL_mutexV()).
    Совет:

    Любые данные, которые могут быть доступны более чем одному потоку одновременно, должны быть защищены семафорами.

    Пример: 

    #include "SDL_thread.h"#include "SDL_mutex.h" int potty = 0;int gotta_go; int thread_func(void *data){    SDL_mutex *lock = (SDL_mutex *)data;    int times_went;     times_went = 0;    while ( gotta_go ) {        SDL_mutexP(lock);    /* Lock  the potty */        ++potty;        printf("Thread %d using the potty\n", SDL_ThreadID());        if ( potty > 1 ) {            printf("Uh oh, somebody else is using the potty!\n");        }        --potty;        SDL_mutexV(lock);        ++times_went;    }    printf("Yep\n");    return(times_went);} {    const int progeny = 5;    SDL_Thread *kids[progeny];    SDL_mutex  *lock;    int i, lots;     /* Create the synchronization lock */    lock = SDL_CreateMutex();     gotta_go = 1;    for ( i=0; i<progeny; ++i ) {        kids[i] = SDL_CreateThread(thread_func, lock);    }     SDL_Delay(5*1000);    SDL_mutexP(lock);    printf("Everybody done?\n");    gotta_go = 0;    SDL_mutexV(lock);     for ( i=0; i<progeny; ++i ) {        SDL_WaitThread(kids[i], &lots);        printf("Thread %d used the potty %d times\n", i+1, lots);    }    SDL_DestroyMutex(lock);}
    <


    [Назад] Содержание [Дальше]


    Содержание раздела