e14743d1 |
1 | <HTML |
2 | ><HEAD |
3 | ><TITLE |
4 | >Multi-threaded Programming</TITLE |
5 | ><META |
6 | NAME="GENERATOR" |
7 | CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+ |
8 | "><LINK |
9 | REL="HOME" |
10 | TITLE="SDL Library Documentation" |
11 | HREF="index.html"><LINK |
12 | REL="UP" |
13 | TITLE="SDL Reference" |
14 | HREF="reference.html"><LINK |
15 | REL="PREVIOUS" |
16 | TITLE="SDL_CDtrack" |
17 | HREF="sdlcdtrack.html"><LINK |
18 | REL="NEXT" |
19 | TITLE="SDL_CreateThread" |
20 | HREF="sdlcreatethread.html"><META |
21 | NAME="KEYWORD" |
22 | CONTENT="threads"><META |
23 | NAME="KEYWORD" |
24 | CONTENT="function"></HEAD |
25 | ><BODY |
26 | CLASS="CHAPTER" |
27 | BGCOLOR="#FFF8DC" |
28 | TEXT="#000000" |
29 | LINK="#0000ee" |
30 | VLINK="#551a8b" |
31 | ALINK="#ff0000" |
32 | ><DIV |
33 | CLASS="NAVHEADER" |
34 | ><TABLE |
35 | SUMMARY="Header navigation table" |
36 | WIDTH="100%" |
37 | BORDER="0" |
38 | CELLPADDING="0" |
39 | CELLSPACING="0" |
40 | ><TR |
41 | ><TH |
42 | COLSPAN="3" |
43 | ALIGN="center" |
44 | >SDL Library Documentation</TH |
45 | ></TR |
46 | ><TR |
47 | ><TD |
48 | WIDTH="10%" |
49 | ALIGN="left" |
50 | VALIGN="bottom" |
51 | ><A |
52 | HREF="sdlcdtrack.html" |
53 | ACCESSKEY="P" |
54 | >Prev</A |
55 | ></TD |
56 | ><TD |
57 | WIDTH="80%" |
58 | ALIGN="center" |
59 | VALIGN="bottom" |
60 | ></TD |
61 | ><TD |
62 | WIDTH="10%" |
63 | ALIGN="right" |
64 | VALIGN="bottom" |
65 | ><A |
66 | HREF="sdlcreatethread.html" |
67 | ACCESSKEY="N" |
68 | >Next</A |
69 | ></TD |
70 | ></TR |
71 | ></TABLE |
72 | ><HR |
73 | ALIGN="LEFT" |
74 | WIDTH="100%"></DIV |
75 | ><DIV |
76 | CLASS="CHAPTER" |
77 | ><H1 |
78 | ><A |
79 | NAME="THREAD" |
80 | ></A |
81 | >Chapter 12. Multi-threaded Programming</H1 |
82 | ><DIV |
83 | CLASS="TOC" |
84 | ><DL |
85 | ><DT |
86 | ><B |
87 | >Table of Contents</B |
88 | ></DT |
89 | ><DT |
90 | ><A |
91 | HREF="sdlcreatethread.html" |
92 | >SDL_CreateThread</A |
93 | > -- Creates a new thread of execution that shares its parent's properties.</DT |
94 | ><DT |
95 | ><A |
96 | HREF="sdlthreadid.html" |
97 | >SDL_ThreadID</A |
98 | > -- Get the 32-bit thread identifier for the current thread.</DT |
99 | ><DT |
100 | ><A |
101 | HREF="sdlgetthreadid.html" |
102 | >SDL_GetThreadID</A |
103 | > -- Get the SDL thread ID of a SDL_Thread</DT |
104 | ><DT |
105 | ><A |
106 | HREF="sdlwaitthread.html" |
107 | >SDL_WaitThread</A |
108 | > -- Wait for a thread to finish.</DT |
109 | ><DT |
110 | ><A |
111 | HREF="sdlkillthread.html" |
112 | >SDL_KillThread</A |
113 | > -- Gracelessly terminates the thread.</DT |
114 | ><DT |
115 | ><A |
116 | HREF="sdlcreatemutex.html" |
117 | >SDL_CreateMutex</A |
118 | > -- Create a mutex</DT |
119 | ><DT |
120 | ><A |
121 | HREF="sdldestroymutex.html" |
122 | >SDL_DestroyMutex</A |
123 | > -- Destroy a mutex</DT |
124 | ><DT |
125 | ><A |
126 | HREF="sdlmutexp.html" |
127 | >SDL_mutexP</A |
128 | > -- Lock a mutex</DT |
129 | ><DT |
130 | ><A |
131 | HREF="sdlmutexv.html" |
132 | >SDL_mutexV</A |
133 | > -- Unlock a mutex</DT |
134 | ><DT |
135 | ><A |
136 | HREF="sdlcreatesemaphore.html" |
137 | >SDL_CreateSemaphore</A |
138 | > -- Creates a new semaphore and assigns an initial value to it.</DT |
139 | ><DT |
140 | ><A |
141 | HREF="sdldestroysemaphore.html" |
142 | >SDL_DestroySemaphore</A |
143 | > -- Destroys a semaphore that was created by <A |
144 | HREF="sdlcreatesemaphore.html" |
145 | >SDL_CreateSemaphore</A |
146 | >.</DT |
147 | ><DT |
148 | ><A |
149 | HREF="sdlsemwait.html" |
150 | >SDL_SemWait</A |
151 | > -- Lock a semaphore and suspend the thread if the semaphore value is zero.</DT |
152 | ><DT |
153 | ><A |
154 | HREF="sdlsemtrywait.html" |
155 | >SDL_SemTryWait</A |
156 | > -- Attempt to lock a semaphore but don't suspend the thread.</DT |
157 | ><DT |
158 | ><A |
159 | HREF="sdlsemwaittimeout.html" |
160 | >SDL_SemWaitTimeout</A |
161 | > -- Lock a semaphore, but only wait up to a specified maximum time.</DT |
162 | ><DT |
163 | ><A |
164 | HREF="sdlsempost.html" |
165 | >SDL_SemPost</A |
166 | > -- Unlock a semaphore.</DT |
167 | ><DT |
168 | ><A |
169 | HREF="sdlsemvalue.html" |
170 | >SDL_SemValue</A |
171 | > -- Return the current value of a semaphore.</DT |
172 | ><DT |
173 | ><A |
174 | HREF="sdlcreatecond.html" |
175 | >SDL_CreateCond</A |
176 | > -- Create a condition variable</DT |
177 | ><DT |
178 | ><A |
179 | HREF="sdldestroycond.html" |
180 | >SDL_DestroyCond</A |
181 | > -- Destroy a condition variable</DT |
182 | ><DT |
183 | ><A |
184 | HREF="sdlcondsignal.html" |
185 | >SDL_CondSignal</A |
186 | > -- Restart a thread wait on a condition variable</DT |
187 | ><DT |
188 | ><A |
189 | HREF="sdlcondbroadcast.html" |
190 | >SDL_CondBroadcast</A |
191 | > -- Restart all threads waiting on a condition variable</DT |
192 | ><DT |
193 | ><A |
194 | HREF="sdlcondwait.html" |
195 | >SDL_CondWait</A |
196 | > -- Wait on a condition variable</DT |
197 | ><DT |
198 | ><A |
199 | HREF="sdlcondwaittimeout.html" |
200 | >SDL_CondWaitTimeout</A |
201 | > -- Wait on a condition variable, with timeout</DT |
202 | ></DL |
203 | ></DIV |
204 | ><P |
205 | >SDL provides functions for creating threads, mutexes, semphores and condition variables.</P |
206 | ><P |
207 | >In general, you must be very aware of concurrency and data integrity issues |
208 | when writing multi-threaded programs. Some good guidelines include: |
209 | <P |
210 | ></P |
211 | ><UL |
212 | ><LI |
213 | ><P |
214 | >Don't call SDL video/event functions from separate threads</P |
215 | ></LI |
216 | ><LI |
217 | ><P |
218 | >Don't use any library functions in separate threads</P |
219 | ></LI |
220 | ><LI |
221 | ><P |
222 | >Don't perform any memory management in separate threads</P |
223 | ></LI |
224 | ><LI |
225 | ><P |
226 | >Lock global variables which may be accessed by multiple threads</P |
227 | ></LI |
228 | ><LI |
229 | ><P |
230 | >Never terminate threads, always set a flag and wait for them to quit</P |
231 | ></LI |
232 | ><LI |
233 | ><P |
234 | >Think very carefully about all possible ways your code may interact</P |
235 | ></LI |
236 | ></UL |
237 | ></P |
238 | ><DIV |
239 | CLASS="NOTE" |
240 | ><BLOCKQUOTE |
241 | CLASS="NOTE" |
242 | ><P |
243 | ><B |
244 | >Note: </B |
245 | >SDL's threading is not implemented on MacOS, due to that lack of preemptive thread support (Mac OS X dos nt suffer from this problem)</P |
246 | ></BLOCKQUOTE |
247 | ></DIV |
248 | ></DIV |
249 | ><DIV |
250 | CLASS="NAVFOOTER" |
251 | ><HR |
252 | ALIGN="LEFT" |
253 | WIDTH="100%"><TABLE |
254 | SUMMARY="Footer navigation table" |
255 | WIDTH="100%" |
256 | BORDER="0" |
257 | CELLPADDING="0" |
258 | CELLSPACING="0" |
259 | ><TR |
260 | ><TD |
261 | WIDTH="33%" |
262 | ALIGN="left" |
263 | VALIGN="top" |
264 | ><A |
265 | HREF="sdlcdtrack.html" |
266 | ACCESSKEY="P" |
267 | >Prev</A |
268 | ></TD |
269 | ><TD |
270 | WIDTH="34%" |
271 | ALIGN="center" |
272 | VALIGN="top" |
273 | ><A |
274 | HREF="index.html" |
275 | ACCESSKEY="H" |
276 | >Home</A |
277 | ></TD |
278 | ><TD |
279 | WIDTH="33%" |
280 | ALIGN="right" |
281 | VALIGN="top" |
282 | ><A |
283 | HREF="sdlcreatethread.html" |
284 | ACCESSKEY="N" |
285 | >Next</A |
286 | ></TD |
287 | ></TR |
288 | ><TR |
289 | ><TD |
290 | WIDTH="33%" |
291 | ALIGN="left" |
292 | VALIGN="top" |
293 | >SDL_CDtrack</TD |
294 | ><TD |
295 | WIDTH="34%" |
296 | ALIGN="center" |
297 | VALIGN="top" |
298 | ><A |
299 | HREF="reference.html" |
300 | ACCESSKEY="U" |
301 | >Up</A |
302 | ></TD |
303 | ><TD |
304 | WIDTH="33%" |
305 | ALIGN="right" |
306 | VALIGN="top" |
307 | >SDL_CreateThread</TD |
308 | ></TR |
309 | ></TABLE |
310 | ></DIV |
311 | ></BODY |
312 | ></HTML |
313 | > |