<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[boost::thread kopiert Objekt&#x2F;löscht Objekt automatisch?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal wieder ein Problem:</p>
<pre><code>boost::ptr_vector&lt;ReadData&gt; readData(this-&gt;mipMaps().size());

for (std::size_t i = 0; i &lt; this-&gt;mipMaps().size(); ++i)
{
	...
	readData.push_back(new ReadData(*this-&gt;mipMaps()[i], buffer, bufferSize, loader));
}

boost::thread_group threadGroup; // added threads are being destroyed automatically when group is being destroyed

for (std::size_t i = 0; i &lt; readData.size(); ++i)
	threadGroup.create_thread(boost::bind(&amp;readMipMapJpeg, &amp;readData[i]));

threadGroup.join_all(); // wait for all threads have finished
</code></pre>
<p>Ich erzeuge einen pointer container, damit das Zeug am Ende automatisch wieder gelöscht wird. Ein Pointer auf ReadData wird bei der Thread-Erzeugung übergeben.</p>
<pre><code>void readMipMapJpeg(ReadData *readData)
{
readData-&gt;lock();
...
readData-&gt;unlock();
}
</code></pre>
<p>ReadData erbt von boost::mutex und kann deshalb gelockt werden. Das Problem ist nun, wenn die obere scope nach &quot;join_all()&quot; verlassen wird, müssten eigentlich die Threads und die ReadData-Objekte gelöscht werden, stattdessen kommt aber:</p>
<blockquote>
<p>/usr/include/boost-1_46/boost/thread/pthread/mutex.hpp:47: boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&amp;m)' failed.</p>
</blockquote>
<p>Zuvor hatte ich eine alte Version getestet, in der ReadData nicht von boost::mutex erbt und ich das lock-Zeug nicht drinnen hatte (der Rest war gleich). Lustigerweise wurde dann aber bei der Schreibfunktion (die im Grunde gleich aussieht) ein scoped-Pointer, der ein Member eines WriteData-Objekts war zweimal freigegeben, was auch zum Absturz führte. Deshalb sieht es für mich irgendwie danach aus als würden die ReadData-Objekte immer zweimal gelöscht werden.<br />
Hier noch die Deklaration von ReadData:</p>
<pre><code>struct ReadData : public boost::mutex
{
	ReadData(Blp::MipMap &amp;mipMap, unsigned char * const data, const std::size_t dataSize, const JpegLoader &amp;loader) : mipMap(mipMap), data(data), dataSize(dataSize), loader(loader)
	{
	}

	Blp::MipMap &amp;mipMap;
	unsigned char * const data;
	const std::size_t dataSize;
	const JpegLoader &amp;loader;
	std::string stateMessage;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/299804/boost-thread-kopiert-objekt-löscht-objekt-automatisch</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 03:12:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299804.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Feb 2012 20:37:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::thread kopiert Objekt&#x2F;löscht Objekt automatisch? on Sat, 18 Feb 2012 20:37:19 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal wieder ein Problem:</p>
<pre><code>boost::ptr_vector&lt;ReadData&gt; readData(this-&gt;mipMaps().size());

for (std::size_t i = 0; i &lt; this-&gt;mipMaps().size(); ++i)
{
	...
	readData.push_back(new ReadData(*this-&gt;mipMaps()[i], buffer, bufferSize, loader));
}

boost::thread_group threadGroup; // added threads are being destroyed automatically when group is being destroyed

for (std::size_t i = 0; i &lt; readData.size(); ++i)
	threadGroup.create_thread(boost::bind(&amp;readMipMapJpeg, &amp;readData[i]));

threadGroup.join_all(); // wait for all threads have finished
</code></pre>
<p>Ich erzeuge einen pointer container, damit das Zeug am Ende automatisch wieder gelöscht wird. Ein Pointer auf ReadData wird bei der Thread-Erzeugung übergeben.</p>
<pre><code>void readMipMapJpeg(ReadData *readData)
{
readData-&gt;lock();
...
readData-&gt;unlock();
}
</code></pre>
<p>ReadData erbt von boost::mutex und kann deshalb gelockt werden. Das Problem ist nun, wenn die obere scope nach &quot;join_all()&quot; verlassen wird, müssten eigentlich die Threads und die ReadData-Objekte gelöscht werden, stattdessen kommt aber:</p>
<blockquote>
<p>/usr/include/boost-1_46/boost/thread/pthread/mutex.hpp:47: boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&amp;m)' failed.</p>
</blockquote>
<p>Zuvor hatte ich eine alte Version getestet, in der ReadData nicht von boost::mutex erbt und ich das lock-Zeug nicht drinnen hatte (der Rest war gleich). Lustigerweise wurde dann aber bei der Schreibfunktion (die im Grunde gleich aussieht) ein scoped-Pointer, der ein Member eines WriteData-Objekts war zweimal freigegeben, was auch zum Absturz führte. Deshalb sieht es für mich irgendwie danach aus als würden die ReadData-Objekte immer zweimal gelöscht werden.<br />
Hier noch die Deklaration von ReadData:</p>
<pre><code>struct ReadData : public boost::mutex
{
	ReadData(Blp::MipMap &amp;mipMap, unsigned char * const data, const std::size_t dataSize, const JpegLoader &amp;loader) : mipMap(mipMap), data(data), dataSize(dataSize), loader(loader)
	{
	}

	Blp::MipMap &amp;mipMap;
	unsigned char * const data;
	const std::size_t dataSize;
	const JpegLoader &amp;loader;
	std::string stateMessage;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2182788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182788</guid><dc:creator><![CDATA[Barade]]></dc:creator><pubDate>Sat, 18 Feb 2012 20:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to boost::thread kopiert Objekt&#x2F;löscht Objekt automatisch? on Sun, 19 Feb 2012 10:45:22 GMT]]></title><description><![CDATA[<p>1. Leite nicht von boost::mutex ab. Die Klasse ist nicht dafür designed eine Basisklasse zu sein.<br />
2. Benutze scoped_lock, um das Freigeben des mutex zu automatisiseren. Der Fehler sieht so aus, als würde etwas doppelt freigeben oder freigegebn was nie gelockt war oder etwas in der Richtung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182910</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 19 Feb 2012 10:45:22 GMT</pubDate></item></channel></rss>