<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Thread problem</title>
		<link>http://www.allegro.cc/forums/view/613991</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 09 Mar 2014 01:16:06 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,</p><p>I&#39;ve been learning about threads recently and tried to make a function that would create and return a thread given an instance of a class where there are the cond, the mutex, and the variables for my thread. The problem is when creating one thread with this function, the program either crashes immediately after running or runs smoothly but then crashes on close. And when I try to create two threads with it it seems to be stuck in the following loop,
</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="k1">while</span><span class="k2">(</span><span class="k3">!</span>data.ready<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 2</span>    <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data.cond, data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span><span class="k2">}</span>
</div></div><p>

I&#39;ve tried changing many things in my code but to no avail and tried to look around but not much luck either there. So here is the code in my thread.cpp file excluding headers, etc:
</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="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number">  2</span>
<span class="number">  3</span>    DATA <span class="k3">*</span>data <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">float</span> num <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    <span class="k1">bool</span> a_bool <span class="k3">=</span> data-&gt;a_bool<span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">bool</span> b_bool <span class="k3">=</span> data-&gt;b_bool<span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">bool</span> c_bool <span class="k3">=</span> data-&gt;c_bool<span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">bool</span> d_bool <span class="k3">=</span> data-&gt;d_bool<span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">bool</span> e_bool <span class="k3">=</span> data-&gt;e_bool<span class="k2">;</span>
<span class="number"> 13</span>    data-&gt;ready <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>data-&gt;cond<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 18</span>
<span class="number"> 19</span>        <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>        <span class="k1">if</span><span class="k2">(</span>a_bool<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 22</span>            
<span class="number"> 23</span>        <span class="k2">}</span>
<span class="number"> 24</span>
<span class="number"> 25</span>        <span class="k1">if</span><span class="k2">(</span>b_bool<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 26</span>
<span class="number"> 27</span>        <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>        <span class="k1">if</span><span class="k2">(</span>c_bool<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 30</span>
<span class="number"> 31</span>        <span class="k2">}</span>
<span class="number"> 32</span>
<span class="number"> 33</span>        <span class="k1">if</span><span class="k2">(</span>d_bool<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 34</span>
<span class="number"> 35</span>        <span class="k2">}</span>
<span class="number"> 36</span>
<span class="number"> 37</span>        <span class="k1">if</span><span class="k2">(</span>e_bool<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 38</span>
<span class="number"> 39</span>        <span class="k2">}</span>
<span class="number"> 40</span>
<span class="number"> 41</span>        <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>
<span class="number"> 43</span>        <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span>thread_delay<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>
<span class="number"> 45</span>    <span class="k2">}</span>
<span class="number"> 46</span>
<span class="number"> 47</span>
<span class="number"> 48</span>    <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 49</span><span class="k2">}</span>
<span class="number"> 50</span>
<span class="number"> 51</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a><span class="k3">*</span> create_thread<span class="k2">(</span>DATA data, <span class="k1">bool</span> a, <span class="k1">bool</span> b, <span class="k1">bool</span> c, <span class="k1">bool</span> d, <span class="k1">bool</span> e, <span class="k1">int</span> thread_number<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 52</span>
<span class="number"> 53</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a><span class="k3">*</span> thread_o <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 54</span>    thread_o <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>    <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_o<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>    <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>data.ready<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 58</span>        <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data.cond, data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>    <span class="k2">}</span>
<span class="number"> 60</span>    <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>
<span class="number"> 62</span>    <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 63</span>    data.a_bool <span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 64</span>    data.b_bool <span class="k3">=</span> b<span class="k2">;</span>
<span class="number"> 65</span>    data.c_bool <span class="k3">=</span> c<span class="k2">;</span>
<span class="number"> 66</span>    data.d_bool <span class="k3">=</span> d<span class="k2">;</span>
<span class="number"> 67</span>    data.e_bool <span class="k3">=</span> e<span class="k2">;</span>
<span class="number"> 68</span>    data.ready <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 69</span>    <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 70</span>
<span class="number"> 71</span>    <span class="k1">return</span> thread_o<span class="k2">;</span>
<span class="number"> 72</span>
<span class="number"> 73</span><span class="k2">}</span>
</div></div><p>

The class I&#39;m using is the same as the one from the tutorial but with more bools. In the main code I have this:
</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>DATA data<span class="k2">;</span>
<span class="number"> 2</span>
<span class="number"> 3</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a><span class="k3">*</span> thread_1 <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 4</span>thread_1 <span class="k3">=</span> create_thread<span class="k2">(</span>data, <span class="k1">true</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="n">0</span><span class="k2">)</span>
</div></div><p>

Thanks for the read, <br />DailyDose
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DailyDose)</author>
		<pubDate>Wed, 05 Mar 2014 07:52:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Probably the main problem is that you are passing a copy of the DATA object in your create_thread function. This means the address that is being passed to the Func_Thread actually points to the copy on the stack from the create_thread, which is destroyed as soon as create_thread exits. You should instead pass in a pointer to the data object.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (someone972)</author>
		<pubDate>Fri, 07 Mar 2014 06:40:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the reply, it fixed the problem in less than 5 minutes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DailyDose)</author>
		<pubDate>Sun, 09 Mar 2014 01:16:06 +0000</pubDate>
	</item>
</rss>
