The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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

Использование Simple DirectMedia Layer API

Потоки

  • Создание простого потока

Создание потока делается через вызов функции 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);
}

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру