<?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[Interrupt threads]]></title><description><![CDATA[<p>Hallo @all ,</p>
<p>ich habe folgendes Problem bzw. folgende Frage:</p>
<p>Um einen Thread zu beenden habe ich bisher immer eine Pollingvariante benutzt:</p>
<pre><code>std::atomic&lt;bool&gt; abbrechen;

void doThread()
{
    while( !abbrechen)
    {
        // Do Stuff
    }
    return;
}
</code></pre>
<p>Nun ist diese Variante leider sehr langsam, da a: zyklisches Abfragen Ressourcen frist und b: atomics irgendwie ziemlich langsam sind :S</p>
<p>Meine Frage ist nun: Gibt es ne Möglichkeit obiges Problem mit einem Interruptzuschreiben?<br />
Ich stell mir das so vor: die Threadfunktion läuft und wenn der User z.B. auf nen Abbrechen-Button drückt, schickt das Programm einen Interrupt, welcher vom Thread erkannt und behandelt wird.</p>
<p>Ich könnte zwar sowas wie KillThread o.Ä. nutzen, aber ich möchte, dass meine Ressourcen (z.B. ein Puffer ) ordentlich freigegeben werden und nicht irgndwo als Speicherleck herumschwirren.</p>
<p>mfG</p>
<p>shft</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328322/interrupt-threads</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 17:18:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328322.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Oct 2014 11:31:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Interrupt threads on Fri, 03 Oct 2014 11:31:50 GMT]]></title><description><![CDATA[<p>Hallo @all ,</p>
<p>ich habe folgendes Problem bzw. folgende Frage:</p>
<p>Um einen Thread zu beenden habe ich bisher immer eine Pollingvariante benutzt:</p>
<pre><code>std::atomic&lt;bool&gt; abbrechen;

void doThread()
{
    while( !abbrechen)
    {
        // Do Stuff
    }
    return;
}
</code></pre>
<p>Nun ist diese Variante leider sehr langsam, da a: zyklisches Abfragen Ressourcen frist und b: atomics irgendwie ziemlich langsam sind :S</p>
<p>Meine Frage ist nun: Gibt es ne Möglichkeit obiges Problem mit einem Interruptzuschreiben?<br />
Ich stell mir das so vor: die Threadfunktion läuft und wenn der User z.B. auf nen Abbrechen-Button drückt, schickt das Programm einen Interrupt, welcher vom Thread erkannt und behandelt wird.</p>
<p>Ich könnte zwar sowas wie KillThread o.Ä. nutzen, aber ich möchte, dass meine Ressourcen (z.B. ein Puffer ) ordentlich freigegeben werden und nicht irgndwo als Speicherleck herumschwirren.</p>
<p>mfG</p>
<p>shft</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420565</guid><dc:creator><![CDATA[shft]]></dc:creator><pubDate>Fri, 03 Oct 2014 11:31:50 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Fri, 03 Oct 2014 11:38:35 GMT]]></title><description><![CDATA[<p>Condition Variables?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420568</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 03 Oct 2014 11:38:35 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Fri, 03 Oct 2014 13:52:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/32463">@shft</a><br />
In welcher Grössenordnung bewegt sich &quot;Do Stuff&quot;?<br />
Hast du Sleep() Aufrufe drinnen um das System nicht auszubremsen?<br />
Bzw. hast du etwa gar eine &quot;busy wait&quot; Schleise die weder nen Sleep noch nen Wait auf ne Condition-Variable verwendet wenn's nix zu tun gibt?</p>
<p>Wenns immer was für den Thread zu tun gibt, er nicht Sleept und &quot;Do Stuff&quot; wenigstens ein paar tausend CPU Zyklen braucht, dann würde ich empfehlen gar nix zu ändern, weil deine Lösung bereits optimal ist.<br />
Falls &quot;Do Stuff&quot; zu kurz ist, dann ändere die Schleife so dass bloss alle 10 oder 100x &quot;stuffen&quot; die Atomic-Variable geprüft wird.<br />
Wenn du Sleep()st dann nimm statt dem Sleep() nen Wait auf ne Condition-Variable.<br />
Und wenn du busy-waiting machst dann geh dich schämen.</p>
<p>shft schrieb:</p>
<blockquote>
<p>Ich stell mir das so vor: die Threadfunktion läuft und wenn der User z.B. auf nen Abbrechen-Button drückt, schickt das Programm einen Interrupt, welcher vom Thread erkannt und behandelt wird.</p>
</blockquote>
<p>So ähnliche Dinge gibt's schon. Sind aber alle mehr oder weniger problematisch. Daher macht man das auch nicht so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420578</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 03 Oct 2014 13:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Fri, 03 Oct 2014 21:10:51 GMT]]></title><description><![CDATA[<p>Der Algorithmus liest in jedem Durchlauf einige Zeichen aus einer Datei,<br />
verarbeitet diese und schreibt in eine Zieldatei; Bei großen Dateien hab ich also mehrere 100 Schleifendurchläufe,<br />
wo durch der Speedup mit einem Counter ( also nur jeden 100. o.Ä. Durchlauf abfragen ) enorm ist.</p>
<p>Ich dachte bzgl. Interrupts gäbe es vllt eine einfache tolle Methode, aber anscheinend reicht die Abfragen zu verringern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420667</guid><dc:creator><![CDATA[sjft]]></dc:creator><pubDate>Fri, 03 Oct 2014 21:10:51 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Fri, 03 Oct 2014 22:08:59 GMT]]></title><description><![CDATA[<p>sjft schrieb:</p>
<blockquote>
<p>Der Algorithmus <strong>liest</strong> in jedem Durchlauf einige Zeichen aus einer <strong>Datei</strong>,<br />
verarbeitet diese und <strong>schreibt</strong> in eine <strong>Zieldatei</strong>; Bei großen Dateien hab ich also mehrere 100 Schleifendurchläufe,<br />
wo durch der <strong>Speedup</strong> mit einem Counter ( also nur jeden 100. o.Ä. Durchlauf abfragen ) <strong>enorm</strong> ist.</p>
</blockquote>
<p>Das fällt mir schwer zu glauben.<br />
Atomics Lesen ist lange nicht so langsam dass das einmalige Lesen einer Atomic-Variable pro Schleifendurchlauf in einer Schleife die File-IO macht merkbar bremsen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420674</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 03 Oct 2014 22:08:59 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Sat, 04 Oct 2014 06:41:23 GMT]]></title><description><![CDATA[<p>Hm...<br />
Ich habe aber mit verringertem Lesen eine Laufzeit von 11 Sekunden und ohne 17 Sekunden... vllt liegt das daran, dass ich in meinem Algorithmus 2 Variablen habe ( eine wird gelesen und eine geschrieben ) , dass Schreiben dauert natürlich wesentlich länger...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420687</guid><dc:creator><![CDATA[shft]]></dc:creator><pubDate>Sat, 04 Oct 2014 06:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Sat, 04 Oct 2014 07:09:12 GMT]]></title><description><![CDATA[<p>shft schrieb:</p>
<blockquote>
<p>Hm...<br />
Ich habe aber mit verringertem Lesen eine Laufzeit von 11 Sekunden und ohne 17 Sekunden...</p>
</blockquote>
<p>Entspricht auch meiner Messung, wenn die Schleife praktisch gar gar nix tut.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;atomic&gt;
using namespace std;

#define SLOW

int main() {
	double x=0.2;
	atomic&lt;int&gt; poison;
	poison.store(0);
	for(int i=0;i&lt;1000000000;++i){
		x=x*x-2;
#ifdef SLOW
		if(poison)
			break;
#endif
	}
	cout&lt;&lt;x&lt;&lt;'\n';
}
</code></pre>
<p>8.547 zu 4.019<br />
Und</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;atomic&gt;
using namespace std;

int main() {
	double x=0.2;
	atomic&lt;int&gt; poison;
	unsigned char c=0;
	poison.store(0);
	for(int i=0;i&lt;1000000000;++i){
		x=x*x-2;
		if(!++c &amp;&amp; poison){
			break;
		}
	}
	cout&lt;&lt;x&lt;&lt;'\n';
}
</code></pre>
<p>4.029</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420689</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 04 Oct 2014 07:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Sat, 04 Oct 2014 09:02:04 GMT]]></title><description><![CDATA[<p>Ja, wenn die Schleife *nix* tut.<br />
Was sjft beschreibt ist aber nicht nix, sondern etwas.<br />
Und OK, &quot;merklich bremsen&quot; darf es da auch - 10% oder so sind auch &quot;merklich&quot;.<br />
Aber es darf nicht so 1:2 reinhauen.</p>
<p>Allerdings egal, die Abfragen auf alle N Durchläufe zu beschränken hat ja keine echten Nachteile, also muss man der Sache auch nicht unbedingt nachgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420699</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 04 Oct 2014 09:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to Interrupt threads on Sun, 05 Oct 2014 07:25:42 GMT]]></title><description><![CDATA[<p>Hab Riesenmist gebaut, sorry.<br />
Die Messung war im Debug-Modus und ist damit total hinfällig.</p>
<p>Im Releasemodus kann ich keinen Unterschied messen: Bei 50 Starts hab ich 0.1% Unterschied, in einer Schleife, die fast nix tut.<br />
Es riecht nach Nullkosten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<pre><code>//Hab damit gemessen
#include &lt;iostream&gt;
#include &lt;atomic&gt;
#include &lt;signal.h&gt;
using namespace std;

atomic&lt;int&gt; poison;

void my_handler(int param){
	poison.store(1);
}

int main() {
	poison.store(0);
	signal(SIGINT,my_handler);
	try{
		double x=0.2;
		for(uint32_t i=0;i&lt;4000000000;++i){
			x=x*x-2;
			if(poison)
				throw 1;
		}
		cout&lt;&lt;x&lt;&lt;'\n';
    }
    catch(...){
		cout&lt;&lt;&quot;terminated gracefully!\n&quot;;
    }
}
</code></pre>
<p>-O3 -march=native -pthread</p>
<p>Das Schreiben in einen atomic kostet aber. Habs probiert mit Threads, die einen atomic&lt;int&gt; mit ++ hochzählen:<br />
Mit volatile int:<br />
1 Thread 1.56s<br />
2 Threads komplett falsches Ergebnis<br />
Mit atomic&lt;int&gt;: (4EchteKerne+4Hyperthreading)<br />
1 Thread 3.34s<br />
2 Threads 12.6s<br />
3 Threads 12.3s<br />
4 Threads 12.3s<br />
5 Threads 12.4s<br />
6 Threads 12.3s<br />
7 Threads 12.4s<br />
8 Threads 12.6s<br />
9 Threads 12.6s<br />
10 Threads 12.6s<br />
20 Threads 12.7s<br />
50 Threads 12.7s<br />
100 Threads 12.7s</p>
<p>shft schrieb:</p>
<blockquote>
<p>Hm...<br />
Ich habe aber mit verringertem Lesen eine Laufzeit von 11 Sekunden und ohne 17 Sekunden... vllt liegt das daran, dass ich in meinem Algorithmus 2 Variablen habe ( eine wird gelesen und eine geschrieben ) , dass Schreiben dauert natürlich wesentlich länger...</p>
</blockquote>
<p>Ja, vielleicht liegt's sogar *nur* am Schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2420821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2420821</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 05 Oct 2014 07:25:42 GMT</pubDate></item></channel></rss>