| <HTML |
| ><HEAD |
| ><TITLE |
| >Multi-threaded Programming</TITLE |
| ><META |
| NAME="GENERATOR" |
| CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ |
| "><LINK |
| REL="HOME" |
| TITLE="SDL Library Documentation" |
| HREF="index.html"><LINK |
| REL="UP" |
| TITLE="SDL Reference" |
| HREF="reference.html"><LINK |
| REL="PREVIOUS" |
| TITLE="SDL_CDtrack" |
| HREF="sdlcdtrack.html"><LINK |
| REL="NEXT" |
| TITLE="SDL_CreateThread" |
| HREF="sdlcreatethread.html"><META |
| NAME="KEYWORD" |
| CONTENT="threads"><META |
| NAME="KEYWORD" |
| CONTENT="function"></HEAD |
| ><BODY |
| CLASS="CHAPTER" |
| BGCOLOR="#FFF8DC" |
| TEXT="#000000" |
| LINK="#0000ee" |
| VLINK="#551a8b" |
| ALINK="#ff0000" |
| ><DIV |
| CLASS="NAVHEADER" |
| ><TABLE |
| SUMMARY="Header navigation table" |
| WIDTH="100%" |
| BORDER="0" |
| CELLPADDING="0" |
| CELLSPACING="0" |
| ><TR |
| ><TH |
| COLSPAN="3" |
| ALIGN="center" |
| >SDL Library Documentation</TH |
| ></TR |
| ><TR |
| ><TD |
| WIDTH="10%" |
| ALIGN="left" |
| VALIGN="bottom" |
| ><A |
| HREF="sdlcdtrack.html" |
| ACCESSKEY="P" |
| >Prev</A |
| ></TD |
| ><TD |
| WIDTH="80%" |
| ALIGN="center" |
| VALIGN="bottom" |
| ></TD |
| ><TD |
| WIDTH="10%" |
| ALIGN="right" |
| VALIGN="bottom" |
| ><A |
| HREF="sdlcreatethread.html" |
| ACCESSKEY="N" |
| >Next</A |
| ></TD |
| ></TR |
| ></TABLE |
| ><HR |
| ALIGN="LEFT" |
| WIDTH="100%"></DIV |
| ><DIV |
| CLASS="CHAPTER" |
| ><H1 |
| ><A |
| NAME="THREAD" |
| ></A |
| >Chapter 12. Multi-threaded Programming</H1 |
| ><DIV |
| CLASS="TOC" |
| ><DL |
| ><DT |
| ><B |
| >Table of Contents</B |
| ></DT |
| ><DT |
| ><A |
| HREF="sdlcreatethread.html" |
| >SDL_CreateThread</A |
| > -- Creates a new thread of execution that shares its parent's properties.</DT |
| ><DT |
| ><A |
| HREF="sdlthreadid.html" |
| >SDL_ThreadID</A |
| > -- Get the 32-bit thread identifier for the current thread.</DT |
| ><DT |
| ><A |
| HREF="sdlgetthreadid.html" |
| >SDL_GetThreadID</A |
| > -- Get the SDL thread ID of a SDL_Thread</DT |
| ><DT |
| ><A |
| HREF="sdlwaitthread.html" |
| >SDL_WaitThread</A |
| > -- Wait for a thread to finish.</DT |
| ><DT |
| ><A |
| HREF="sdlkillthread.html" |
| >SDL_KillThread</A |
| > -- Gracelessly terminates the thread.</DT |
| ><DT |
| ><A |
| HREF="sdlcreatemutex.html" |
| >SDL_CreateMutex</A |
| > -- Create a mutex</DT |
| ><DT |
| ><A |
| HREF="sdldestroymutex.html" |
| >SDL_DestroyMutex</A |
| > -- Destroy a mutex</DT |
| ><DT |
| ><A |
| HREF="sdlmutexp.html" |
| >SDL_mutexP</A |
| > -- Lock a mutex</DT |
| ><DT |
| ><A |
| HREF="sdlmutexv.html" |
| >SDL_mutexV</A |
| > -- Unlock a mutex</DT |
| ><DT |
| ><A |
| HREF="sdlcreatesemaphore.html" |
| >SDL_CreateSemaphore</A |
| > -- Creates a new semaphore and assigns an initial value to it.</DT |
| ><DT |
| ><A |
| HREF="sdldestroysemaphore.html" |
| >SDL_DestroySemaphore</A |
| > -- Destroys a semaphore that was created by <A |
| HREF="sdlcreatesemaphore.html" |
| >SDL_CreateSemaphore</A |
| >.</DT |
| ><DT |
| ><A |
| HREF="sdlsemwait.html" |
| >SDL_SemWait</A |
| > -- Lock a semaphore and suspend the thread if the semaphore value is zero.</DT |
| ><DT |
| ><A |
| HREF="sdlsemtrywait.html" |
| >SDL_SemTryWait</A |
| > -- Attempt to lock a semaphore but don't suspend the thread.</DT |
| ><DT |
| ><A |
| HREF="sdlsemwaittimeout.html" |
| >SDL_SemWaitTimeout</A |
| > -- Lock a semaphore, but only wait up to a specified maximum time.</DT |
| ><DT |
| ><A |
| HREF="sdlsempost.html" |
| >SDL_SemPost</A |
| > -- Unlock a semaphore.</DT |
| ><DT |
| ><A |
| HREF="sdlsemvalue.html" |
| >SDL_SemValue</A |
| > -- Return the current value of a semaphore.</DT |
| ><DT |
| ><A |
| HREF="sdlcreatecond.html" |
| >SDL_CreateCond</A |
| > -- Create a condition variable</DT |
| ><DT |
| ><A |
| HREF="sdldestroycond.html" |
| >SDL_DestroyCond</A |
| > -- Destroy a condition variable</DT |
| ><DT |
| ><A |
| HREF="sdlcondsignal.html" |
| >SDL_CondSignal</A |
| > -- Restart a thread wait on a condition variable</DT |
| ><DT |
| ><A |
| HREF="sdlcondbroadcast.html" |
| >SDL_CondBroadcast</A |
| > -- Restart all threads waiting on a condition variable</DT |
| ><DT |
| ><A |
| HREF="sdlcondwait.html" |
| >SDL_CondWait</A |
| > -- Wait on a condition variable</DT |
| ><DT |
| ><A |
| HREF="sdlcondwaittimeout.html" |
| >SDL_CondWaitTimeout</A |
| > -- Wait on a condition variable, with timeout</DT |
| ></DL |
| ></DIV |
| ><P |
| >SDL provides functions for creating threads, mutexes, semphores and condition variables.</P |
| ><P |
| >In general, you must be very aware of concurrency and data integrity issues |
| when writing multi-threaded programs. Some good guidelines include: |
| <P |
| ></P |
| ><UL |
| ><LI |
| ><P |
| >Don't call SDL video/event functions from separate threads</P |
| ></LI |
| ><LI |
| ><P |
| >Don't use any library functions in separate threads</P |
| ></LI |
| ><LI |
| ><P |
| >Don't perform any memory management in separate threads</P |
| ></LI |
| ><LI |
| ><P |
| >Lock global variables which may be accessed by multiple threads</P |
| ></LI |
| ><LI |
| ><P |
| >Never terminate threads, always set a flag and wait for them to quit</P |
| ></LI |
| ><LI |
| ><P |
| >Think very carefully about all possible ways your code may interact</P |
| ></LI |
| ></UL |
| ></P |
| ><DIV |
| CLASS="NOTE" |
| ><BLOCKQUOTE |
| CLASS="NOTE" |
| ><P |
| ><B |
| >Note: </B |
| >SDL's threading is not implemented on MacOS, due to the lack of preemptive thread support on that OS (Mac OS X doesn't suffer from this problem)</P |
| ></BLOCKQUOTE |
| ></DIV |
| ></DIV |
| ><DIV |
| CLASS="NAVFOOTER" |
| ><HR |
| ALIGN="LEFT" |
| WIDTH="100%"><TABLE |
| SUMMARY="Footer navigation table" |
| WIDTH="100%" |
| BORDER="0" |
| CELLPADDING="0" |
| CELLSPACING="0" |
| ><TR |
| ><TD |
| WIDTH="33%" |
| ALIGN="left" |
| VALIGN="top" |
| ><A |
| HREF="sdlcdtrack.html" |
| ACCESSKEY="P" |
| >Prev</A |
| ></TD |
| ><TD |
| WIDTH="34%" |
| ALIGN="center" |
| VALIGN="top" |
| ><A |
| HREF="index.html" |
| ACCESSKEY="H" |
| >Home</A |
| ></TD |
| ><TD |
| WIDTH="33%" |
| ALIGN="right" |
| VALIGN="top" |
| ><A |
| HREF="sdlcreatethread.html" |
| ACCESSKEY="N" |
| >Next</A |
| ></TD |
| ></TR |
| ><TR |
| ><TD |
| WIDTH="33%" |
| ALIGN="left" |
| VALIGN="top" |
| >SDL_CDtrack</TD |
| ><TD |
| WIDTH="34%" |
| ALIGN="center" |
| VALIGN="top" |
| ><A |
| HREF="reference.html" |
| ACCESSKEY="U" |
| >Up</A |
| ></TD |
| ><TD |
| WIDTH="33%" |
| ALIGN="right" |
| VALIGN="top" |
| >SDL_CreateThread</TD |
| ></TR |
| ></TABLE |
| ></DIV |
| ></BODY |
| ></HTML |
| > |