<?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[Pthread, Mutexe, Zugriff nur bei neuen Daten, Assert Ownership]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein kleines Problem mit Mutexen.</p>
<p>Zwei Threads sollen auf gemeinsamen Speicher zugreifen.</p>
<p>Jetzt ist das grundsätzlich kein Problem:<br />
- der eine lockt den Speicher, schreibt was rein, gibt frei.<br />
- der zweite lockt den Speicher, liest was raus, gibt frei.</p>
<p>Doch ein kleines Problem ergibt sich dennoch...der zweite Thread soll nämlich nur aus dem Shared Mem lesen, wenn neue Daten dort liegen. Die gleichen Daten soll er nicht noch einmal abholen.</p>
<p>Bisher wurde dies mit einem zweiten Mutex erledigt, dem SignalMutex. Dieser wurde bei neuen Daten vom ersten Thread freigegeben. Der zweite Thread sperrte diesen dann vor dem Auslesen der Daten im Shared Mem.</p>
<p>Das Problem ist halt, das eigentlich ja nur der Thread den Mutex freigeben darf, der ihn auch gesperrt hat. Also kamen teilweise Fehler im Programm wegen der Besitzerüberprüfung vor.</p>
<p>Wie kann man nun dies verhindern? Wie nutzt man sowas richtig?</p>
<p>Hier mal der Code, der für Lesen und schreiben jetzt benutzt wird...man beachte, daß im Moment ein Thread-Polling läuft, was erst recht nicht ideal ist...</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::read (T *target) {
//	if (pthread_mutex_lock (&amp;(this-&gt;signalMutex)) == 0) {
	while (newData == false) {
		usleep(1);
	}
		if (pthread_mutex_lock (&amp;(this-&gt;memMutex)) == 0) {
			*target = *data;
			newData = false;
			pthread_mutex_unlock (&amp;(this-&gt;memMutex));
		}
//	}
	return;
}

template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::write (T &amp;source) {
	if (pthread_mutex_lock (&amp;memMutex) == 0) {
		*data = source;
		newData = true;
		pthread_mutex_unlock (&amp;memMutex);
//		pthread_mutex_unlock (&amp;signalMutex);
	}
}
</code></pre>
<p>EDIT: Ups, falsches Forum, Linux/Unix wär wohl passender gewesen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263706/pthread-mutexe-zugriff-nur-bei-neuen-daten-assert-ownership</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 14:32:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263706.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Mar 2010 20:01:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pthread, Mutexe, Zugriff nur bei neuen Daten, Assert Ownership on Wed, 24 Mar 2010 20:05:38 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ein kleines Problem mit Mutexen.</p>
<p>Zwei Threads sollen auf gemeinsamen Speicher zugreifen.</p>
<p>Jetzt ist das grundsätzlich kein Problem:<br />
- der eine lockt den Speicher, schreibt was rein, gibt frei.<br />
- der zweite lockt den Speicher, liest was raus, gibt frei.</p>
<p>Doch ein kleines Problem ergibt sich dennoch...der zweite Thread soll nämlich nur aus dem Shared Mem lesen, wenn neue Daten dort liegen. Die gleichen Daten soll er nicht noch einmal abholen.</p>
<p>Bisher wurde dies mit einem zweiten Mutex erledigt, dem SignalMutex. Dieser wurde bei neuen Daten vom ersten Thread freigegeben. Der zweite Thread sperrte diesen dann vor dem Auslesen der Daten im Shared Mem.</p>
<p>Das Problem ist halt, das eigentlich ja nur der Thread den Mutex freigeben darf, der ihn auch gesperrt hat. Also kamen teilweise Fehler im Programm wegen der Besitzerüberprüfung vor.</p>
<p>Wie kann man nun dies verhindern? Wie nutzt man sowas richtig?</p>
<p>Hier mal der Code, der für Lesen und schreiben jetzt benutzt wird...man beachte, daß im Moment ein Thread-Polling läuft, was erst recht nicht ideal ist...</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::read (T *target) {
//	if (pthread_mutex_lock (&amp;(this-&gt;signalMutex)) == 0) {
	while (newData == false) {
		usleep(1);
	}
		if (pthread_mutex_lock (&amp;(this-&gt;memMutex)) == 0) {
			*target = *data;
			newData = false;
			pthread_mutex_unlock (&amp;(this-&gt;memMutex));
		}
//	}
	return;
}

template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::write (T &amp;source) {
	if (pthread_mutex_lock (&amp;memMutex) == 0) {
		*data = source;
		newData = true;
		pthread_mutex_unlock (&amp;memMutex);
//		pthread_mutex_unlock (&amp;signalMutex);
	}
}
</code></pre>
<p>EDIT: Ups, falsches Forum, Linux/Unix wär wohl passender gewesen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873532</guid><dc:creator><![CDATA[danowar]]></dc:creator><pubDate>Wed, 24 Mar 2010 20:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pthread, Mutexe, Zugriff nur bei neuen Daten, Assert Ownership on Wed, 24 Mar 2010 20:24:46 GMT]]></title><description><![CDATA[<p>Ich versteh dein Problem nicht ganz. Dein bool wird doch nur innerhalb von Abschnitten verändert die eh durch ein Mutex geschützt sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873545</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Wed, 24 Mar 2010 20:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pthread, Mutexe, Zugriff nur bei neuen Daten, Assert Ownership on Wed, 24 Mar 2010 21:41:07 GMT]]></title><description><![CDATA[<p>Genau dafür gibt es Condition-Variablen.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::read(T *target) {
    lock_mutex(this-&gt;memMutex);
    wait_condition(this-&gt;memChangedCondition, this-&gt;memMutex); // gibt memMutex, wartet dann auf die Condition, lockt memMutex wieder, und kommt dann zurück
    *target = *data;
    unlock_mutex(this-&gt;memMutex);
    return;
}

template &lt;class T&gt;
void MutexSharedMem &lt;T&gt;::write(T &amp;source) {
    lock_mutex(this-&gt;memMutex);
    *data = source;
    signal_condition(this-&gt;memChangedCondition); // &quot;signalisiert&quot; die Condition, d.h. sorgt dafür, dass wait_condition() in read() zurückkommt
    pthread_mutex_unlock(&amp;memMutex);
}
</code></pre>
<p>Die genauen Namen/Parameter der Funktionen such dir bitte aus der PTHREADS Doku raus (ich verwende PTHREADS nie &quot;roh&quot;, weiss daher nicht auswendig wie die heissen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873589</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Mar 2010 21:41:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pthread, Mutexe, Zugriff nur bei neuen Daten, Assert Ownership on Fri, 26 Mar 2010 14:46:25 GMT]]></title><description><![CDATA[<p>Danke schön, hat mir sehr geholfen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13869">@rean</a>: Das Problem ist halt, daß bei meiner Variante der thread nicht schlafengelegt wurde, sondern zwischendurch die ganze Zeit gepollt und so CPU-Zeit gefressen hat. Bei der Condition-Variante wird der Thread solange schlafengelegt, bis die Bedingung erfüllt/signalisiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874215</guid><dc:creator><![CDATA[danowar]]></dc:creator><pubDate>Fri, 26 Mar 2010 14:46:25 GMT</pubDate></item></channel></rss>