<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>adding Multithreading pthread.h</title>
		<link>http://www.allegro.cc/forums/view/591243</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 05 May 2007 20:35:09 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have been messing around for some time with a small game and now trying to add multithreading to the equation.  Sure it is not needed but I just wanted to test it out this is what I got.  Problem lies with in where at game start if just freezes my computer and I have to hit the reset button.  I am unsure to what I am missing or making my mistake on, but right at program start it tries to do the multithreading area of the program which it shouldn&#039;t. Even removing the calls doesn&#039;t stop it from running.</p><p>skipping most of the non needed stuff Full program link can be added if needed
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;pthread.h&gt;</span>
<span class="number">  2</span>pthread_mutex_t threadsafe <span class="k3">=</span> PTHREAD_MUTEX_INITIALIZER<span class="k2">;</span>
<span class="number">  3</span><span class="k1">for</span> <span class="k2">(</span>a <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> a <span class="k3">&lt;</span> maxa<span class="k2">;</span> a<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  4</span>     xi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">5</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  5</span>     yi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">5</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span> 
<span class="number">  6</span>     x<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">500</span> <span class="k3">+</span> <span class="n">20</span><span class="k2">;</span>
<span class="number">  7</span>     y<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> %<span class="n">400</span> <span class="k3">+</span> <span class="n">20</span><span class="k2">;</span>
<span class="number">  8</span>     c<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">253</span> <span class="k3">+</span> <span class="n">1</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">253</span> <span class="k3">+</span> <span class="n">1</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">253</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>     <span class="k2">}</span>
<span class="number"> 10</span><span class="k1">void</span><span class="k3">*</span> thread0<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span>
<span class="number"> 11</span><span class="k2">{</span>
<span class="number"> 12</span>      <span class="k1">int</span> my_thread_id <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>     <span class="c">//For Pixelate Demo Addition</span>
<span class="number"> 14</span>     <span class="k1">while</span><span class="k2">(</span>lives <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 15</span>     <span class="k2">{</span>
<span class="number"> 16</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 17</span>           <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> <span class="k2">(</span><span class="n">4</span><span class="k3">*</span><span class="n">19</span><span class="k2">)</span>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span>,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,<span class="s">"Error: Thread mutex was locked"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>        <span class="k1">for</span> <span class="k2">(</span>a <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> a <span class="k3">&lt;</span> <span class="n">100</span><span class="k2">;</span> a<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 19</span>           <span class="k1">if</span> <span class="k2">(</span>x<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">4</span> <span class="k3">-</span> xi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> x<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">&lt;</span> <span class="n">3</span> <span class="k3">-</span> xi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 20</span>              xi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <span class="k3">-</span>xi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 21</span>           <span class="k1">if</span> <span class="k2">(</span>y<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">&gt;</span> Floors.y <span class="k3">-</span> <span class="n">4</span> <span class="k3">-</span> yi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> y<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">&lt;</span> <span class="n">13</span> <span class="k3">-</span> yi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 22</span>              yi<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> <span class="k3">-</span>yi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 23</span>           x<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> x<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">+</span> xi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 24</span>           y<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">=</span> y<span class="k2">[</span>a<span class="k2">]</span> <span class="k3">+</span> yi<span class="k2">[</span>a<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 25</span>           <span class="c">//putpixel(active_page,x[a],y[a],c[a]);</span>
<span class="number"> 26</span>           <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>active_page,x<span class="k2">[</span>a<span class="k2">]</span>,y<span class="k2">[</span>a<span class="k2">]</span>,BallSize <span class="k3">/</span> <span class="n">5</span>,c<span class="k2">[</span>a<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>           <span class="c">//putpixel(active_page,x[a] - xi[a],y[a] - yi[a],makecol(0,0,0));</span>
<span class="number"> 28</span>           <span class="k2">}</span>
<span class="number"> 29</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 30</span>           <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> <span class="k2">(</span><span class="n">4</span><span class="k3">*</span><span class="n">19</span><span class="k2">)</span>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span>,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,<span class="s">"Error: Thread mutex was unlocked"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>        <span class="c">//For Pixelate demo addition</span>
<span class="number"> 32</span>     <span class="k2">}</span>
<span class="number"> 33</span>     pthread_exit<span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>     <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span><span class="k1">int</span> id<span class="k2">;</span>
<span class="number"> 37</span>    pthread_t pthread0<span class="k2">;</span>
<span class="number"> 38</span>    <span class="k1">int</span> threadid0 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 39</span>    id <span class="k3">=</span> pthread_create<span class="k2">(</span><span class="k3">&amp;</span>pthread0, NULL, thread0, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>threadid0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> lives <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 41</span>    <span class="k2">{</span>
<span class="number"> 42</span>        pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>        multicheck<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>        singlecheck<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>        movemouse<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>        mousehold<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>        drawback<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>        checkdead<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>        
<span class="number"> 50</span>        
<span class="number"> 51</span>        <a href="http://www.allegro.cc/manual/show_video_bitmap" target="_blank"><span class="a">show_video_bitmap</span></a><span class="k2">(</span>active_page<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>        <span class="k1">if</span> <span class="k2">(</span>active_page <span class="k3">=</span><span class="k3">=</span> buffer<span class="k2">)</span>
<span class="number"> 53</span>         active_page <span class="k3">=</span> buffer2<span class="k2">;</span>
<span class="number"> 54</span>        <span class="k1">else</span>
<span class="number"> 55</span>           active_page <span class="k3">=</span> buffer<span class="k2">;</span>           
<span class="number"> 56</span>        <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>active_page, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>        pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>        
<span class="number"> 60</span>    <span class="k2">}</span>
<span class="number"> 61</span>pthread_mutex_destroy<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>    <span class="c">//destroy_bitmap(active_page);</span>
<span class="number"> 63</span>  
<span class="number"> 64</span>    
<span class="number"> 65</span>    <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 67</span>     
<span class="number"> 68</span><span class="k2">}</span>
<span class="number"> 69</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
</div></div><p>

Most of the multithreading was taken directly from a book I was reading a while back.  Game Programming All In One pg 405-413 for those who have the book.
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span>
<span class="number">   2</span><span class="p">#include &lt;pthread.h&gt;</span>
<span class="number">   3</span><span class="p">#include "allegro.h"</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="p">#define MODE GFX_AUTODETECT_FULLSCREEN</span>
<span class="number">   6</span><span class="p">#define WIDTH 640</span>
<span class="number">   7</span><span class="p">#define HEIGHT 480</span>
<span class="number">   8</span><span class="p">#define BLACK makecol(0,0,0)</span>
<span class="number">   9</span><span class="p">#define WHITE makecol(255,255,255)</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="c">//define the sprite structure</span>
<span class="number">  12</span><span class="k1">typedef</span> <span class="k1">struct</span> SPRITE
<span class="number">  13</span><span class="k2">{</span>
<span class="number">  14</span>    <span class="k1">int</span> dir, alive<span class="k2">;</span>
<span class="number">  15</span>    <span class="k1">int</span> x,y<span class="k2">;</span>
<span class="number">  16</span>    <span class="k1">int</span> width,height<span class="k2">;</span>
<span class="number">  17</span>    <span class="k1">int</span> xspeed,yspeed<span class="k2">;</span>
<span class="number">  18</span>    <span class="k1">int</span> xdelay,ydelay<span class="k2">;</span>
<span class="number">  19</span>    <span class="k1">int</span> xcount,ycount<span class="k2">;</span>
<span class="number">  20</span>    <span class="k1">int</span> curframe,maxframe,animdir<span class="k2">;</span>
<span class="number">  21</span>    <span class="k1">int</span> framecount,framedelay<span class="k2">;</span>
<span class="number">  22</span><span class="k2">}</span>SPRITE<span class="k2">;</span>
<span class="number">  23</span>
<span class="number">  24</span><span class="c">//variables</span>
<span class="number">  25</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">;</span>
<span class="number">  26</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>ballimg<span class="k2">[</span><span class="n">32</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  27</span>SPRITE theballs<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  28</span>SPRITE <span class="k3">*</span>balls<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  29</span><span class="k1">int</span> done<span class="k2">;</span>
<span class="number">  30</span><span class="k1">int</span> n<span class="k2">;</span>
<span class="number">  31</span>
<span class="number">  32</span><span class="c">//create a new thread mutex to protect variables</span>
<span class="number">  33</span>pthread_mutex_t threadsafe <span class="k3">=</span> PTHREAD_MUTEX_INITIALIZER<span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span>
<span class="number">  36</span><span class="k1">void</span> erasesprite<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest, SPRITE <span class="k3">*</span>spr<span class="k2">)</span>
<span class="number">  37</span><span class="k2">{</span>
<span class="number">  38</span>    <span class="c">//erase the sprite</span>
<span class="number">  39</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>dest, spr-&gt;x, spr-&gt;y, spr-&gt;x <span class="k3">+</span> spr-&gt;width, 
<span class="number">  40</span>        spr-&gt;y <span class="k3">+</span> spr-&gt;height, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span><span class="k2">}</span>
<span class="number">  42</span>
<span class="number">  43</span><span class="k1">void</span> updatesprite<span class="k2">(</span>SPRITE <span class="k3">*</span>spr<span class="k2">)</span>
<span class="number">  44</span><span class="k2">{</span>
<span class="number">  45</span>    <span class="c">//update x position</span>
<span class="number">  46</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>spr-&gt;xcount <span class="k3">&gt;</span> spr-&gt;xdelay<span class="k2">)</span>
<span class="number">  47</span>    <span class="k2">{</span>
<span class="number">  48</span>        spr-&gt;xcount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  49</span>        spr-&gt;x <span class="k3">+</span><span class="k3">=</span> spr-&gt;xspeed<span class="k2">;</span>
<span class="number">  50</span>    <span class="k2">}</span>
<span class="number">  51</span>
<span class="number">  52</span>    <span class="c">//update y position</span>
<span class="number">  53</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>spr-&gt;ycount <span class="k3">&gt;</span> spr-&gt;ydelay<span class="k2">)</span>
<span class="number">  54</span>    <span class="k2">{</span>
<span class="number">  55</span>        spr-&gt;ycount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  56</span>        spr-&gt;y <span class="k3">+</span><span class="k3">=</span> spr-&gt;yspeed<span class="k2">;</span>
<span class="number">  57</span>    <span class="k2">}</span>
<span class="number">  58</span>
<span class="number">  59</span>    <span class="c">//update frame based on animdir</span>
<span class="number">  60</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>spr-&gt;framecount <span class="k3">&gt;</span> spr-&gt;framedelay<span class="k2">)</span>
<span class="number">  61</span>    <span class="k2">{</span>
<span class="number">  62</span>        spr-&gt;framecount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  63</span>        <span class="k1">if</span> <span class="k2">(</span>spr-&gt;animdir <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span>
<span class="number">  64</span>        <span class="k2">{</span>
<span class="number">  65</span>            <span class="k1">if</span> <span class="k2">(</span><span class="k3">-</span><span class="k3">-</span>spr-&gt;curframe <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  66</span>                spr-&gt;curframe <span class="k3">=</span> spr-&gt;maxframe<span class="k2">;</span>
<span class="number">  67</span>        <span class="k2">}</span>
<span class="number">  68</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>spr-&gt;animdir <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number">  69</span>        <span class="k2">{</span>
<span class="number">  70</span>            <span class="k1">if</span> <span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>spr-&gt;curframe <span class="k3">&gt;</span> spr-&gt;maxframe<span class="k2">)</span>
<span class="number">  71</span>                spr-&gt;curframe <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  72</span>        <span class="k2">}</span>
<span class="number">  73</span>    <span class="k2">}</span>
<span class="number">  74</span><span class="k2">}</span>
<span class="number">  75</span>
<span class="number">  76</span><span class="c">//this version doesn't change speed, just direction</span>
<span class="number">  77</span><span class="k1">void</span> bouncesprite<span class="k2">(</span>SPRITE <span class="k3">*</span>spr<span class="k2">)</span>
<span class="number">  78</span><span class="k2">{</span>
<span class="number">  79</span>    <span class="c">//simple screen bouncing behavior</span>
<span class="number">  80</span>    <span class="k1">if</span> <span class="k2">(</span>spr-&gt;x <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  81</span>    <span class="k2">{</span>
<span class="number">  82</span>        spr-&gt;x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  83</span>        spr-&gt;xspeed <span class="k3">=</span> <span class="k3">-</span>spr-&gt;xspeed<span class="k2">;</span>
<span class="number">  84</span>        spr-&gt;animdir <span class="k3">*</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  85</span>    <span class="k2">}</span>
<span class="number">  86</span>
<span class="number">  87</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>spr-&gt;x <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> spr-&gt;width<span class="k2">)</span>
<span class="number">  88</span>    <span class="k2">{</span>
<span class="number">  89</span>        spr-&gt;x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> spr-&gt;width<span class="k2">;</span>
<span class="number">  90</span>        spr-&gt;xspeed <span class="k3">=</span> <span class="k3">-</span>spr-&gt;xspeed<span class="k2">;</span>
<span class="number">  91</span>        spr-&gt;animdir <span class="k3">*</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  92</span>    <span class="k2">}</span>
<span class="number">  93</span>
<span class="number">  94</span>    <span class="k1">if</span> <span class="k2">(</span>spr-&gt;y <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  95</span>    <span class="k2">{</span>
<span class="number">  96</span>        spr-&gt;y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  97</span>        spr-&gt;yspeed <span class="k3">=</span> <span class="k3">-</span>spr-&gt;yspeed<span class="k2">;</span>
<span class="number">  98</span>        spr-&gt;animdir <span class="k3">*</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  99</span>    <span class="k2">}</span>
<span class="number"> 100</span>
<span class="number"> 101</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>spr-&gt;y <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a> <span class="k3">-</span> spr-&gt;height<span class="k2">)</span>
<span class="number"> 102</span>    <span class="k2">{</span>
<span class="number"> 103</span>        spr-&gt;y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a> <span class="k3">-</span> spr-&gt;height<span class="k2">;</span>
<span class="number"> 104</span>        spr-&gt;yspeed <span class="k3">=</span> <span class="k3">-</span>spr-&gt;yspeed<span class="k2">;</span>
<span class="number"> 105</span>        spr-&gt;animdir <span class="k3">*</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 106</span>    <span class="k2">}</span>
<span class="number"> 107</span><span class="k2">}</span>
<span class="number"> 108</span>
<span class="number"> 109</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>grabframe<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>source, 
<span class="number"> 110</span>                  <span class="k1">int</span> width, <span class="k1">int</span> height, 
<span class="number"> 111</span>                  <span class="k1">int</span> startx, <span class="k1">int</span> starty, 
<span class="number"> 112</span>                  <span class="k1">int</span> columns, <span class="k1">int</span> frame<span class="k2">)</span>
<span class="number"> 113</span><span class="k2">{</span>
<span class="number"> 114</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>temp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>width,height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>    <span class="k1">int</span> x <span class="k3">=</span> startx <span class="k3">+</span> <span class="k2">(</span>frame % columns<span class="k2">)</span> <span class="k3">*</span> width<span class="k2">;</span>
<span class="number"> 116</span>    <span class="k1">int</span> y <span class="k3">=</span> starty <span class="k3">+</span> <span class="k2">(</span>frame <span class="k3">/</span> columns<span class="k2">)</span> <span class="k3">*</span> height<span class="k2">;</span>
<span class="number"> 117</span>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>source,temp,x,y,<span class="n">0</span>,<span class="n">0</span>,width,height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span>    <span class="k1">return</span> temp<span class="k2">;</span>
<span class="number"> 119</span><span class="k2">}</span>
<span class="number"> 120</span>
<span class="number"> 121</span><span class="k1">void</span> loadsprites<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 122</span><span class="k2">{</span>
<span class="number"> 123</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>temp<span class="k2">;</span>
<span class="number"> 124</span>
<span class="number"> 125</span>    <span class="c">//load sprite images</span>
<span class="number"> 126</span>    temp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"sphere.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 127</span>    <span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="n">32</span><span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 128</span>        ballimg<span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span> grabframe<span class="k2">(</span>temp,<span class="n">64</span>,<span class="n">64</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">8</span>,n<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>temp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</span>    <span class="c">//initialize the sprite</span>
<span class="number"> 132</span>    <span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="n">2</span><span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 133</span>    <span class="k2">{</span>
<span class="number"> 134</span>        balls<span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span> <span class="k3">&amp;</span>theballs<span class="k2">[</span>n<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 135</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> ballimg<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a> <span class="k3">-</span> ballimg<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>width <span class="k3">=</span> ballimg<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w<span class="k2">;</span>
<span class="number"> 138</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>height <span class="k3">=</span> ballimg<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">;</span>
<span class="number"> 139</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>xdelay <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 140</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>ydelay <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 141</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>xcount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 142</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>ycount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 143</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>xspeed <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 144</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>yspeed <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 145</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>curframe <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">32</span><span class="k2">;</span>
<span class="number"> 146</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>maxframe <span class="k3">=</span> <span class="n">31</span><span class="k2">;</span>
<span class="number"> 147</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>framecount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 148</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>framedelay <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 149</span>        balls<span class="k2">[</span>n<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>animdir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 150</span>    <span class="k2">}</span>
<span class="number"> 151</span><span class="k2">}</span>
<span class="number"> 152</span>
<span class="number"> 153</span><span class="c">//this thread updates sprite 0</span>
<span class="number"> 154</span><span class="k1">void</span><span class="k3">*</span> thread0<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span>
<span class="number"> 155</span><span class="k2">{</span>
<span class="number"> 156</span>    <span class="c">//get this thread id</span>
<span class="number"> 157</span>    <span class="k1">int</span> my_thread_id <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 158</span>
<span class="number"> 159</span>    <span class="c">//thread's main loop</span>
<span class="number"> 160</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number"> 161</span>    <span class="k2">{</span>
<span class="number"> 162</span>        <span class="c">//lock the mutex to protect variables</span>
<span class="number"> 163</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 164</span>            textout<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"ERROR: thread mutex was locked"</span>,<span class="n">0</span>,<span class="n">0</span>,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>        
<span class="number"> 166</span>        <span class="c">//erase sprite 0</span>
<span class="number"> 167</span>        erasesprite<span class="k2">(</span>buffer, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 168</span>
<span class="number"> 169</span>        <span class="c">//update sprite 0</span>
<span class="number"> 170</span>        updatesprite<span class="k2">(</span>balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 171</span>
<span class="number"> 172</span>        <span class="c">//bounce sprite 0</span>
<span class="number"> 173</span>        bouncesprite<span class="k2">(</span>balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>
<span class="number"> 175</span>        <span class="c">//draw sprite 0</span>
<span class="number"> 176</span>        <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer, ballimg<span class="k2">[</span>balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>curframe<span class="k2">]</span>, 
<span class="number"> 177</span>            balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>
<span class="number"> 179</span>        <span class="c">//print sprite number</span>
<span class="number"> 180</span>        textout<span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="s">"0"</span>, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>
<span class="number"> 182</span>        <span class="c">//display sprite position</span>
<span class="number"> 183</span>        textprintf<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">0</span>,<span class="n">10</span>,WHITE,<span class="s">"THREAD ID %d, SPRITE (%3d,%3d)"</span>,
<span class="number"> 184</span>            my_thread_id, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 185</span>
<span class="number"> 186</span>        <span class="c">//unlock the mutex</span>
<span class="number"> 187</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 188</span>            textout<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"ERROR: thread mutex unlock error"</span>,<span class="n">0</span>,<span class="n">0</span>,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 189</span>
<span class="number"> 190</span>        <span class="c">//slow down (this thread only!)</span>
<span class="number"> 191</span>      <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 192</span>    <span class="k2">}</span>
<span class="number"> 193</span>
<span class="number"> 194</span>    <span class="c">// terminate the thread</span>
<span class="number"> 195</span>    pthread_exit<span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 196</span>
<span class="number"> 197</span>    <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 198</span><span class="k2">}</span>
<span class="number"> 199</span>
<span class="number"> 200</span><span class="c">//this thread updates sprite 1</span>
<span class="number"> 201</span><span class="k1">void</span><span class="k3">*</span> thread1<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span>
<span class="number"> 202</span><span class="k2">{</span>
<span class="number"> 203</span>    <span class="c">//get this thread id</span>
<span class="number"> 204</span>    <span class="k1">int</span> my_thread_id <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 205</span>
<span class="number"> 206</span>    <span class="c">//thread's main loop</span>
<span class="number"> 207</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number"> 208</span>    <span class="k2">{</span>
<span class="number"> 209</span>        <span class="c">//lock the mutex to protect variables</span>
<span class="number"> 210</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 211</span>            textout<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"ERROR: thread mutex was locked"</span>,<span class="n">0</span>,<span class="n">0</span>,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 212</span>
<span class="number"> 213</span>        <span class="c">//erase sprite 1</span>
<span class="number"> 214</span>        erasesprite<span class="k2">(</span>buffer, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 215</span>
<span class="number"> 216</span>        <span class="c">//update sprite 1</span>
<span class="number"> 217</span>        updatesprite<span class="k2">(</span>balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 218</span>
<span class="number"> 219</span>        <span class="c">//bounce sprite 1</span>
<span class="number"> 220</span>        bouncesprite<span class="k2">(</span>balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 221</span>
<span class="number"> 222</span>        <span class="c">//draw sprite 1</span>
<span class="number"> 223</span>        <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer, ballimg<span class="k2">[</span>balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>curframe<span class="k2">]</span>, 
<span class="number"> 224</span>            balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 225</span>
<span class="number"> 226</span>        <span class="c">//print sprite number</span>
<span class="number"> 227</span>        textout<span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="s">"1"</span>, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 228</span>
<span class="number"> 229</span>        <span class="c">//display sprite position</span>
<span class="number"> 230</span>        textprintf<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="n">0</span>,<span class="n">20</span>,WHITE,<span class="s">"THREAD ID %d, SPRITE (%3d,%3d)"</span>,
<span class="number"> 231</span>            my_thread_id, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>x, balls<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>
<span class="number"> 233</span>        <span class="c">//unlock the mutex</span>
<span class="number"> 234</span>        <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 235</span>            textout<span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"ERROR: thread mutex unlock error"</span>,<span class="n">0</span>,<span class="n">0</span>,WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 236</span>
<span class="number"> 237</span>        <span class="c">//slow down (this thread only!)</span>
<span class="number"> 238</span>      <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 239</span>    <span class="k2">}</span>
<span class="number"> 240</span>
<span class="number"> 241</span>    <span class="c">// terminate the thread</span>
<span class="number"> 242</span>    pthread_exit<span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 243</span>
<span class="number"> 244</span>    <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 245</span><span class="k2">}</span>
<span class="number"> 246</span>
<span class="number"> 247</span><span class="c">//program's primary thread</span>
<span class="number"> 248</span><span class="k1">void</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 249</span><span class="k2">{</span>
<span class="number"> 250</span>    <span class="k1">int</span> id<span class="k2">;</span>
<span class="number"> 251</span>    pthread_t pthread0<span class="k2">;</span>
<span class="number"> 252</span>    pthread_t pthread1<span class="k2">;</span>
<span class="number"> 253</span>    <span class="k1">int</span> threadid0 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 254</span>    <span class="k1">int</span> threadid1 <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 255</span>
<span class="number"> 256</span>    <span class="c">//initialize</span>
<span class="number"> 257</span>    <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 258</span>    <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 259</span>    <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>MODE, WIDTH, HEIGHT, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 260</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_739.html" target="_blank">srand</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 261</span>    <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 262</span>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 263</span>
<span class="number"> 264</span>    <span class="c">//create double buffer</span>
<span class="number"> 265</span>    buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>
<span class="number"> 267</span>    <span class="c">//load ball sprite </span>
<span class="number"> 268</span>    loadsprites<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 269</span>
<span class="number"> 270</span>    <span class="c">//create the thread for sprite 0</span>
<span class="number"> 271</span>    id <span class="k3">=</span> pthread_create<span class="k2">(</span><span class="k3">&amp;</span>pthread0, NULL, thread0, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>threadid0<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 272</span>
<span class="number"> 273</span>    <span class="c">//create the thread for sprite 1</span>
<span class="number"> 274</span>    id <span class="k3">=</span> pthread_create<span class="k2">(</span><span class="k3">&amp;</span>pthread1, NULL, thread1, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>threadid1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 275</span>
<span class="number"> 276</span>    <span class="c">//main loop</span>
<span class="number"> 277</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 278</span>    <span class="k2">{</span>
<span class="number"> 279</span>        <span class="c">//lock the mutex to protect double buffer</span>
<span class="number"> 280</span>        pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 281</span>
<span class="number"> 282</span>        <span class="c">//display title</span>
<span class="number"> 283</span>        textout<span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="s">"MultiThread Program (ESC to quit)"</span>, <span class="n">0</span>, <span class="n">0</span>, WHITE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 284</span>
<span class="number"> 285</span>        <span class="c">//update the screen</span>
<span class="number"> 286</span>        <a href="http://www.allegro.cc/manual/acquire_screen" target="_blank"><span class="a">acquire_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 287</span>        <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,SCREEN_W-1,SCREEN_H-1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 288</span>        <a href="http://www.allegro.cc/manual/release_screen" target="_blank"><span class="a">release_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 289</span>
<span class="number"> 290</span>        <span class="c">//unlock the mutex</span>
<span class="number"> 291</span>        pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 292</span>
<span class="number"> 293</span>        <span class="c">//note there is no delay</span>
<span class="number"> 294</span>    <span class="k2">}</span>
<span class="number"> 295</span>
<span class="number"> 296</span>    <span class="c">//tell threads it's time to quit</span>
<span class="number"> 297</span>    done<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 298</span>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 299</span>
<span class="number"> 300</span>    <span class="c">//kill the mutex (thread protection)</span>
<span class="number"> 301</span>    pthread_mutex_destroy<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 302</span>    
<span class="number"> 303</span>    <span class="c">//remove objects from memory</span>
<span class="number"> 304</span>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 305</span>
<span class="number"> 306</span>    <span class="c">//delete sprites</span>
<span class="number"> 307</span>    <span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="n">32</span><span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 308</span>        <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>ballimg<span class="k2">[</span>n<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 309</span>
<span class="number"> 310</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 311</span><span class="k2">}</span>
<span class="number"> 312</span>
<span class="number"> 313</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
</div></div><p>

<a href="http://www.geocities.com/jensen_305/Fallingballerr.zip">http://www.geocities.com/jensen_305/Fallingballerr.zip</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Wed, 02 May 2007 22:15:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><ul><li><p><s>pthread_mutex_lock and pthread_mutex_unlock return 0 if they were successful but you treat that as an error condition.</s> This is wrong, you don&#39;t treat it as an error condition.</p></li><li><p>Not to mention that your textprintf&#39;ing to the screen when the mutex fails to lock defeats the purpose of using the mutex (you are using a mutex to say that it is okay to use Allegro&#39;s resources, so if the mutex locking fails, you can&#39;t use Allegro&#39;s resources).</p></li><li><p>Also, note that pthread_mutex_lock will not fail because the mutex was already locked. It will only fail if the mutex was destroyed. pthread_mutex_unlock will also only ever fail if the mutex was destroyed.</p></li><li><p>Your call to pthread_exit isn&#39;t needed, also.</p></li></ul><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Game Programming All In One pg 405-413 for those who have the book.
</p></div></div><p>We hear a ton of horrible programming practices gotten from this book.</p><p>[edit]<br />Edited for correctness.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 02 May 2007 23:37:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nothing else to say than what CGamesPlay said. Too slow :p
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 02 May 2007 23:53:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fixed a few things.  But still remains that right at start the multithreaded part of the program is trying to start and just freezes.  I used a graphical feature to show what was being multithreaded.  At the start of the game is a main menu <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> the &quot;bouncing balls&quot; should be applied when the game is started but instead they are starting at the main screen it gets (guessing) 3-5 loops and locks up.  What I do not understand is what am I doing that starts the calls for the multithreaded parts of my program.</p><p>Compiles no errors just locks up on run.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Thu, 03 May 2007 08:42:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, you must have a dead lock somewhere in your code. That is typically why threaded program froze.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Thu, 03 May 2007 12:41:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What should I be looking for in my program.  What kind of things might cause this.  It really doesn&#39;t effect the game play to have it out now, but perhaps later when there is more going on I may want to have it implemented just in case.</p><p>I code in a simple form &quot;Newbish&quot; so to speak.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">if</span> <span class="k2">(</span>Balls<span class="k2">[</span>n<span class="k2">]</span>.y <span class="k3">&gt;</span> Floors.y <span class="k3">-</span> BallSize<span class="k2">)</span></td></tr><tr><td class="number">2</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>        spls <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>        splashed<span class="k2">[</span>n<span class="k2">]</span>.x <span class="k3">=</span> Balls<span class="k2">[</span>n<span class="k2">]</span>.x<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>        splashed<span class="k2">[</span>n<span class="k2">]</span>.y <span class="k3">=</span> Balls<span class="k2">[</span>n<span class="k2">]</span>.y<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>        s <span class="k3">=</span> n<span class="k2">;</span> <span class="c">//Mark location of Splash</span></td></tr><tr><td class="number">7</td><td>        <a href="http://www.allegro.cc/manual/play_sample" target="_blank"><span class="a">play_sample</span></a><span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/SAMPLE" target="_blank"><span class="a">SAMPLE</span></a> <span class="k3">*</span><span class="k2">)</span>data<span class="k2">[</span>EXPLODE2_WAV<span class="k2">]</span>.dat, volume, pan, pitch, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>        splashes<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>        dead<span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">//mark ball as dead</span></td></tr><tr><td class="number">10</td><td>        Balls<span class="k2">[</span>n<span class="k2">]</span>.y <span class="k3">=</span> <span class="n">0</span> <span class="k3">+</span> BallSize<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>        dropball<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>        lives--<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>        FrC <span class="k3">=</span> FrC <span class="k3">-</span> <span class="n">25</span><span class="k2">;</span> <span class="c">//Changes the floor color on dropped ball</span></td></tr><tr><td class="number">14</td><td>        FbC <span class="k3">=</span> FbC <span class="k3">+</span> <span class="n">25</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>        FgC <span class="k3">=</span> FgC<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    <span class="k2">}</span></td></tr></tbody></table></div></div><p>

Showing how simplistic I keep things.</p><p>Maybe I should add everything that adds multithreading until I get the error. Let me see what causes it exactly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Thu, 03 May 2007 12:58:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should add some <span class="source-code"><a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span>...<span class="k2">)</span></span> in your code to see where you stop.</p><p>Step by step debugging could help too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Thu, 03 May 2007 12:59:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Trace is new to me should try it out.  I am fairly new to the programming thing and havent done any debugging stuff with my compiler yet will have to try that aswell.</p><p>hitting the post button to test</p><p>ok with just this line commented out the program works.</p><p>circlefill(active_page,x[a],y[a],BallSize / 5,c[a]);</p><p>if I add<br />textprintf_ex(screen,font,0,10,makecol(255,255,255),-1,&quot;%i&quot;,x[1]);</p><p>instead of the circle movements it shows that it works but again starts right off the bat before it should.  sorry I edit a lot.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Thu, 03 May 2007 13:06:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What kind of things might cause this.
</p></div></div><p>
A deadlock happens when two subjects cross they need for objects. Example, you have P1, P2 which are processes and R1, R2 which are resources.</p><p>P1 owns R1 and needs R2, P2 owns R2 and needs R1. You have a deadlock because none of the processes can go on until the other releases the resource it&#39;s owning.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Marco Radaelli)</author>
		<pubDate>Thu, 03 May 2007 20:53:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would suggest you skip threading entirely and then come back to it later.</p><p>If you can&#39;t do that, then I would start off with some dead simple thread programs and work your way up.  This app is a tad complicated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Thu, 03 May 2007 23:49:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Taking the easy way is never my thing.  I got it working and have isolated the problem.  Now working around the problem is something else.</p><p>If I use...</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,xx<span class="k2">[</span>z<span class="k2">]</span>,yy<span class="k2">[</span>z<span class="k2">]</span>,BallSize <span class="k3">/</span> <span class="n">5</span>,c<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

instead of...</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>active_page,xx<span class="k2">[</span>z<span class="k2">]</span>,yy<span class="k2">[</span>z<span class="k2">]</span>,BallSize <span class="k3">/</span> <span class="n">5</span>,c<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

So my next question is how do I tell the multithread to hold off and wait till the main program is done.  I assumed that would be done with pthread_mutex_lock and pthread_mutex_unlock but I guess I am wrong.  </p><p>Where would be a good place to learn about pthread?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Fri, 04 May 2007 08:08:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It makes no sense whatsoever to use threads to handle paging.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Fri, 04 May 2007 08:14:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am using the thread to handle background graphics. Having some fun.  The paging is done out side the thread.</p><div class="source-code snippet"><div class="inner"><pre>        <a href="http://www.allegro.cc/manual/show_video_bitmap" target="_blank"><span class="a">show_video_bitmap</span></a><span class="k2">(</span>active_page<span class="k2">)</span><span class="k2">;</span>
        <span class="k1">if</span> <span class="k2">(</span>active_page <span class="k3">=</span><span class="k3">=</span> buffer<span class="k2">)</span>
         active_page <span class="k3">=</span> buffer2<span class="k2">;</span>
        <span class="k1">else</span>
           active_page <span class="k3">=</span> buffer<span class="k2">;</span>           
        <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>active_page, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

question was on how to tell the threaded area of my program to hold on while the main program uses a resource.</p><p>if I use</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> <span class="k2">(</span>z <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> z <span class="k3">&lt;</span> <span class="n">1000</span><span class="k2">;</span> z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
        <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>active_page,xx<span class="k2">[</span>z<span class="k2">]</span>,yy<span class="k2">[</span>z<span class="k2">]</span>,BallSize <span class="k3">/</span> <span class="n">5</span>,c<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
</pre></div></div><p> </p><p>outside the threaded program it works fine.  But the point is to get it to work inside the threaded area.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Fri, 04 May 2007 08:25:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Taking the easy way is never my thing. I got it working and have isolated the problem. Now working around the problem is something else.
</p></div></div><p>

If you&#39;re not into &#39;easy things&#39; then why are you asking these guys to write your code for you instead of you studying the <a href="http://www.advancedlinuxprogramming.com/alp-folder">relevant subject ie threads and communicating process with semaphores and mutexes?</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (nonnus29)</author>
		<pubDate>Fri, 04 May 2007 09:03:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow tons of help.  I understand as to how they work not to why it is not working.</p><p>another example which SHOULD lock variables till it is done but doesn&#39;t
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span><span class="k3">*</span> thread0<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> data<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>      <span class="k1">int</span> my_thread_id <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span>data<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>     <span class="c">//For Pixelate Demo Addition</span></td></tr><tr><td class="number">5</td><td>     <span class="k1">while</span> <span class="k2">(</span>lives <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>     <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>        pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">8</td><td>        <span class="k1">for</span> <span class="k2">(</span>z <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> z <span class="k3">&lt;</span> <span class="n">20</span><span class="k2">;</span> z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>           <span class="k1">if</span> <span class="k2">(</span>xx<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">4</span> <span class="k3">-</span> xi<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> xx<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&lt;</span> <span class="n">3</span> <span class="k3">-</span> xi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>              xi<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="k3">-</span>xi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>           <span class="k1">if</span> <span class="k2">(</span>yy<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&gt;</span> Floors.y <span class="k3">-</span> <span class="n">4</span> <span class="k3">-</span> yi<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> yy<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&lt;</span> <span class="n">13</span> <span class="k3">-</span> yi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">12</td><td>              yi<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="k3">-</span>yi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>           xx<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> xx<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">+</span> xi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>           yy<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> yy<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">+</span> yi<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>           <span class="c">//trying to get the active_page to work in here</span></td></tr><tr><td class="number">16</td><td>           <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>active_page,xx<span class="k2">[</span>z<span class="k2">]</span>,yy<span class="k2">[</span>z<span class="k2">]</span>,BallSize <span class="k3">/</span> <span class="n">5</span>,c<span class="k2">[</span>z<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>           <span class="k2">}</span></td></tr><tr><td class="number">18</td><td>           pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>threadsafe<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>           <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>        <span class="c">//For Pixelate demo addition</span></td></tr><tr><td class="number">21</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>     <span class="c">//pthread_exit(NULL);</span></td></tr><tr><td class="number">23</td><td>     <span class="k1">return</span> NULL<span class="k2">;</span></td></tr></tbody></table></div></div><p>

but instead of helping find what seems to everyone else like a small mistake I get the run around.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Fri, 04 May 2007 09:25:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The point is it&#39;s not small, multi threading is really hard.  Can anyone gurantee that allegro, or direct x or anything else isn&#39;t running a thread in the background that&#39;s causing deadlocks with your thread?  I can&#39;t.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (nonnus29)</author>
		<pubDate>Fri, 04 May 2007 09:32:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can. I use threads a lot with allegro, and all the deadlock I had were caused by me.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 04 May 2007 11:02:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This also a deadlock caused by me.  Simple comment out showed me what was doing it aswell.</p><p>If I just use a BITMAP that my main program does not have access to like &quot;screen&quot; then everything works fine. Only problem is it still slows the main program down where to my understanding each thread should have its own speed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Fri, 04 May 2007 11:17:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, but if they both access the same critical section, they will wait each other to free the locked ressource before doing some stuff.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 04 May 2007 11:26:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was also under the impression when I pthread_mutex_lock it would lock the resources it was using till pthread_mutex_unlock was passed both my main loop and my thread use this.  While screen works both can not use active_page even when locking for some reason.</p><p>If I could lock out the main loop from using the BITMAP active_page when the thread was using it things would be easier and vice versa.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Fri, 04 May 2007 11:35:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Locking a mutex prevents other threads from locking the same mutex. If a thread locks a mutex, and another tries to lock the same mutex, the second will block (wait) until the first thread unlocks the mutex. THis makes it so two threads can&#39;t touch the same data at the same time.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
my understanding each thread should have its own speed.
</p></div></div><p>
When two threads handle the same data, they have to do syncronization (usually through mutexes) so they don&#39;t step on each others toes. This quickly leads to performance degradation on both parts. Using threads is not a recipe for speed. It&#39;s a tool to help make more efficient use of resources when properly handled.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sat, 05 May 2007 02:24:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks to those that helped and gave advice.  I was able to get my program to work.  Although not entirely the way I wanted but work none the less.</p><p>To GullRaDriel for pointing out that I may have a deadlock.  Once figured out where was fairly easy to fix.  Thanks.</p><p>To Marco Radaelli for the explination of exactly what happens when a deadlock occurs.  Thanks</p><p>To Dustin Dettmer helping to get me to realize I am over my head <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>To nonnus29 with that awsome link with all sorts of information about threads and much more. Thanks.</p><p>Thanks for all the help.</p><p>-Consider this thread closed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Sat, 05 May 2007 20:35:09 +0000</pubDate>
	</item>
</rss>
