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