<?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[Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in letzter Zeit immer wieder das Problem, dass ich eine Klasse mit bestimmter Funktionalität in einem eigenen (background thread) arbeiten lasse bis diese fertig ist oder unterbrochen wird.</p>
<p>Das Problem dabei ist, dass die Klasse oft so designed wurde, dass sie von dieser unterbrechnungs-Funktionalität nichts weiß.</p>
<p>Zum Beispiel ein Lexer: Der könnte ja erstmal (vereinfacht) so aussehen (in Anlehung an das <a href="https://www.c-plusplus.net/forum/268247">Tutorial</a> hier):</p>
<pre><code>class lexer
{
    std::string input;
    size_t pos;
    char last_char;
public:
    lexer(std::string const &amp;input);
    token get_next();
    bool finished() const;
};
</code></pre>
<p>Soweit so gut, das geht auch alles. Jetzt will ich eine teure Operation (also zum Beispiel das lexen eines langen Texts) in einem Hintergrund-Thread erledigen und das Ganze unterbrechbar machen. Also etwa so:</p>
<pre><code>lexer lex(&quot;irgendein langer Text&quot;);

while (!lex.finished())
{
    auto t = lex.get_next(); // Hole nächstes token
    if (thread_should_stop()) // Überprüfen ob thread unterbrochen werden soll
    {
        break; // Abbruch, thread wird beendet
    }
}
</code></pre>
<p>Auch das klappt wie gewünscht und problemlos. Hier kümmert sich die thread Funktion um den Abbruch und der Lexer selbst muss davon nichts wissen. So wie es sein soll.</p>
<p>Mein Problem ist jetzt, dass etwa die <code>get_next</code> Methode sehr lange brauchen kann wenn das token extrem lang ist (mehrere Sekunden). Das ist insofern blöd, dass der Abbruch dann nicht sofort passiert sondern erst nach einer merklichen Wartezeit.</p>
<p>Um das zu vermeiden müsste ich aber die Abbruchbedingung direkt in den lexer implementieren, der ja generisch sein soll und eigentlich nichts davon weiß ob er in einem eingenen thread läuft oder nicht - ein Widerspruch?</p>
<p>Wie könnte man das Problem am besten lösen? Muss man die allgemeingültigkeit des Lexers aufgeben oder gibt es eine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332073/klassen-unterbrechbar-machen-die-eigentlich-nichts-davon-wissen-sollen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 15:09:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332073.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Apr 2015 08:11:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 08:12:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in letzter Zeit immer wieder das Problem, dass ich eine Klasse mit bestimmter Funktionalität in einem eigenen (background thread) arbeiten lasse bis diese fertig ist oder unterbrochen wird.</p>
<p>Das Problem dabei ist, dass die Klasse oft so designed wurde, dass sie von dieser unterbrechnungs-Funktionalität nichts weiß.</p>
<p>Zum Beispiel ein Lexer: Der könnte ja erstmal (vereinfacht) so aussehen (in Anlehung an das <a href="https://www.c-plusplus.net/forum/268247">Tutorial</a> hier):</p>
<pre><code>class lexer
{
    std::string input;
    size_t pos;
    char last_char;
public:
    lexer(std::string const &amp;input);
    token get_next();
    bool finished() const;
};
</code></pre>
<p>Soweit so gut, das geht auch alles. Jetzt will ich eine teure Operation (also zum Beispiel das lexen eines langen Texts) in einem Hintergrund-Thread erledigen und das Ganze unterbrechbar machen. Also etwa so:</p>
<pre><code>lexer lex(&quot;irgendein langer Text&quot;);

while (!lex.finished())
{
    auto t = lex.get_next(); // Hole nächstes token
    if (thread_should_stop()) // Überprüfen ob thread unterbrochen werden soll
    {
        break; // Abbruch, thread wird beendet
    }
}
</code></pre>
<p>Auch das klappt wie gewünscht und problemlos. Hier kümmert sich die thread Funktion um den Abbruch und der Lexer selbst muss davon nichts wissen. So wie es sein soll.</p>
<p>Mein Problem ist jetzt, dass etwa die <code>get_next</code> Methode sehr lange brauchen kann wenn das token extrem lang ist (mehrere Sekunden). Das ist insofern blöd, dass der Abbruch dann nicht sofort passiert sondern erst nach einer merklichen Wartezeit.</p>
<p>Um das zu vermeiden müsste ich aber die Abbruchbedingung direkt in den lexer implementieren, der ja generisch sein soll und eigentlich nichts davon weiß ob er in einem eingenen thread läuft oder nicht - ein Widerspruch?</p>
<p>Wie könnte man das Problem am besten lösen? Muss man die allgemeingültigkeit des Lexers aufgeben oder gibt es eine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449438</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 08 Apr 2015 08:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 09:09:09 GMT]]></title><description><![CDATA[<p>Da Klassen niemals ausgeführt werden, kann man sie auch nicht unterbrechen.</p>
<p>Für Funktionen gilt, was du gesagt hast: sie können eine Bedingung prüfen und sich gegebenenfalls beenden. Bei verschachtelten Funktionen ist dann natürlich die Frage, wie der Aufrufer darauf reagieren soll.</p>
<p>Dein Lexer muss also darauf vorbereitet sein, er muss aber nicht wissen, ob er in einem separaten Thread herausgeführt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449447</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 08 Apr 2015 09:09:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 09:35:27 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Da Klassen niemals ausgeführt werden, kann man sie auch nicht unterbrechen.</p>
</blockquote>
<p>Schon klar, das meinte ich ja <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Dein Lexer muss also darauf vorbereitet sein, er muss aber nicht wissen, ob er in einem separaten Thread herausgeführt wird.</p>
</blockquote>
<p>Ja, aber wie?</p>
<p>Ich muss ja irgendwo in <code>get_next</code> dann entsprechen <code>thread_should_stop</code> aufrufen - welches eine member Funktion meiner worker Klasse ist. Um auf dieses Zugriff zu haben müsste der lexer aber eine Referenz auf diese worker Klasse speichern. Also würde er &quot;wissen&quot; dass er in einem eigenen thread ausgeführt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449452</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 08 Apr 2015 09:35:27 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 09:50:25 GMT]]></title><description><![CDATA[<p>Ist dir schon mal aufgefallen, dass man das Wort &quot;Unterbrecher&quot; nicht ohne &quot;Erbrecher&quot; schreiben kann?</p>
<p>Zum Thema:</p>
<p>Ich würde dem Lexer ein eigenes Flag &quot;lexer_should_stop&quot; geben. Das kannst du dann auf false setzen, wenn der Worker beendet werden soll. Dann weiß der Lexer nichts darüber, dass er in einem eigenen Thread läuft oder was ein Worker ist, bietet aber trotzdem die Möglichkeit, über irgend einen Mechanismus beendet zu werden. Um so ein Flag kommst du ja nicht rum - der Lexer muss ja wissen, dass er die Ausführung beenden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449453</guid><dc:creator><![CDATA[Unterbrecher]]></dc:creator><pubDate>Wed, 08 Apr 2015 09:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 09:58:49 GMT]]></title><description><![CDATA[<p>Unterbrecher schrieb:</p>
<blockquote>
<p>Ist dir schon mal aufgefallen, dass man das Wort &quot;Unterbrecher&quot; nicht ohne &quot;Erbrecher&quot; schreiben kann?</p>
</blockquote>
<p>Ja. Und?</p>
<p>Unterbrecher schrieb:</p>
<blockquote>
<p>Zum Thema:</p>
<p>Ich würde dem Lexer ein eigenes Flag &quot;lexer_should_stop&quot; geben. Das kannst du dann auf false setzen, wenn der Worker beendet werden soll. Dann weiß der Lexer nichts darüber, dass er in einem eigenen Thread läuft oder was ein Worker ist, bietet aber trotzdem die Möglichkeit, über irgend einen Mechanismus beendet zu werden. Um so ein Flag kommst du ja nicht rum - der Lexer muss ja wissen, dass er die Ausführung beenden soll.</p>
</blockquote>
<p>Wie soll das mit einem flag im lexer gehen?? Der lexer wird doch nicht von außerhalb geprüft ob gestoppt werden soll, sondern er muss das selbst überprüfen. Das relevante flag befindet sich schließlich in der worker Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449457</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 08 Apr 2015 09:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 09:59:09 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Ich muss ja irgendwo in <code>get_next</code> dann entsprechen <code>thread_should_stop</code> aufrufen - welches eine member Funktion meiner worker Klasse ist. Um auf dieses Zugriff zu haben müsste der lexer aber eine Referenz auf diese worker Klasse speichern. Also würde er &quot;wissen&quot; dass er in einem eigenen thread ausgeführt wird.</p>
</blockquote>
<p>Wenn du bei jeder Antwort flugs ein paar neue Bedingungen nachlegst, wirst du nicht weit kommen.</p>
<pre><code class="language-cpp">class lexer
{
...
    std::atomic&lt;bool&gt; abort_function = false;

    token get_next()
    {
       if(abort_function) // hier beenden
    }
};
</code></pre>
<p>Wer auch immer entscheidet, dass der Thread zu beenden ist, muss abort_function auf true setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449458</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 08 Apr 2015 09:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 11:02:01 GMT]]></title><description><![CDATA[<p>Wenn dein Lexer so langsam ist, hast du andere Probleme...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449471</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 08 Apr 2015 11:02:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 11:29:23 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Wer auch immer entscheidet, dass der Thread zu beenden ist, muss abort_function auf true setzen.</p>
</blockquote>
<p>Hm ja, das meinte ich. Also ich komme wohl nicht darum rum das in irgendeiner Form direkt im lexer zu implementieren... Na gut, dann muss ichs wohl so machen^^</p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Wenn dein Lexer so langsam ist, hast du andere Probleme...</p>
</blockquote>
<p>Wie kannst du das beurteilen ohne überhaupt den input zu kennen? Ab einer bestimmten Größe geht jeder lexer mal in die Knie <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Die Implementierung ist ziemlich genau nach dem oben verlinkten tutorial gemacht, dachte eigentlich da das von dieser Seite hier kommt ist die auch ziemlich gut...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449475</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 08 Apr 2015 11:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 11:54:44 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Unterbrecher schrieb:</p>
<blockquote>
<p>Ist dir schon mal aufgefallen, dass man das Wort &quot;Unterbrecher&quot; nicht ohne &quot;Erbrecher&quot; schreiben kann?</p>
</blockquote>
<p>Ja. Und?</p>
</blockquote>
<p>Nichts weiter.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Wie soll das mit einem flag im lexer gehen?? Der lexer wird doch nicht von außerhalb geprüft ob gestoppt werden soll, sondern er muss das selbst überprüfen. Das relevante flag befindet sich schließlich in der worker Klasse.</p>
</blockquote>
<p>Du setzt das Flag von außerhalb über eine Methode des Lexers und dieser prüft intern das Flag. Woher soll er sonst wissen, dass er beendet werden soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449477</guid><dc:creator><![CDATA[Detaillierer]]></dc:creator><pubDate>Wed, 08 Apr 2015 11:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 12:43:13 GMT]]></title><description><![CDATA[<p>Ich würde das Beschaffen des Inputs erst einmal aus dem Lexer herausziehen.</p>
<pre><code class="language-cpp">enum class input_status
{
	success,
	end,
	cancelled
};

struct input_element
{
	input_status status;
	char value_if_success;
};

struct input
{
	virtual ~input();
	virtual input_element get_next() = 0;
};

struct lexer
{
	explicit lexer(input &amp;in);
};
</code></pre>
<p>Der hässliche Multi-Threading-Teil kommt in eine separate Klasse. Um mit dem Atomic nicht zu viel Zeit zu verschwenden, habe ich einen Optimierungsversuch unternommen. Ob das auf deiner Hardware unter deinem Workload relevant ist, weiß ich natürlich nicht.</p>
<pre><code class="language-cpp">struct cancellable_input : input
{
	explicit cancellable_input(boost::iterator_range&lt;char const *&gt; remaining)
		: remaining(remaining)
	{
	}

	virtual input_element get_next() override
	{
		size_t const cancellation_latency = 1000;
		if (remaining.size() % cancellation_latency == 0)
		{
			//Es könnte unter Umständen sehr teuer sein ständig atomar zu lesen.
			//Deswegen wird das hier im Beispiel nur jeweils nach ${cancellation_latency} Elementen gemacht.
			if (cancelled)
			{
				return input_element{input_status::cancelled, 0};
			}
		}
		if (remaining.empty())
		{
			return input_element{input_status::end, 0};
		}
		char c = remaining.front();
		remaining.pop_front();
		return input_element{input_status::success, c};
	}

	void cancel()
	{
		cancelled = true;
	}

private:

	boost::iterator_range&lt;char const *&gt; remaining;
	std::atomic&lt;bool&gt; cancelled;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2449483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449483</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 08 Apr 2015 12:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 14:42:13 GMT]]></title><description><![CDATA[<p>Ok, danke für den Vorschlag, werd ich mir gleich mal genauer anschauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449500</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 08 Apr 2015 14:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Thu, 09 Apr 2015 00:30:16 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a><br />
Das ist aber auch keine allgemeine Lösung.<br />
Was wenn der Lexer kein Lexer ist, und auch mal pro Input Element mehrere Sekunden brauchen kann?<br />
Oder wenn man sinnvollerweise nicht eine virtuelle Funktion pro Zeichen aufrufen mag.</p>
<p>----</p>
<p>Die hier gestellte Frage ist mit C++ mMn. grundsätzlich unlösbar. Wenn man Funktionen unterbrechbar machen möchte, dann muss man sie halt unterbrechbar machen. Automagisch geht da nix.<br />
Die einfachste Variante das zu machen ist wohl ein <code>atomic&lt;bool&gt; cancelFlag</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449505</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 09 Apr 2015 00:30:16 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Wed, 08 Apr 2015 16:00:58 GMT]]></title><description><![CDATA[<p>Vielleicht ist das so besser:</p>
<pre><code class="language-cpp">struct lexer
{
    token get_next(std::atomic&lt;bool&gt; const &amp;abort_function)
    {
		while ...
		{
			if(abort_function) // hier beenden
		}
    }
};
</code></pre>
<p>Die Referenz kann man beliebig tief weitergeben und so oft prüfen, wie nötig.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Oder wenn man sinnvollerweise nicht eine virtuelle Funktion pro Zeichen aufrufen mag.</p>
</blockquote>
<p>Weil virtuelle Methoden ja so teuer sind und es keine Templates gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449507</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 08 Apr 2015 16:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Thu, 09 Apr 2015 00:36:11 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Oder wenn man sinnvollerweise nicht eine virtuelle Funktion pro Zeichen aufrufen mag.</p>
</blockquote>
<p>Weil virtuelle Methoden ja so teuer sind und es keine Templates gibt.</p>
</blockquote>
<p>Ja, Templates zu verwenden wäre eine Möglichkeit. Du hast es halt mit virtuellen Funktionen gezeigt. Und ja, bei einem Lexer pro <code>char</code> eine virtuelle Funktion aufrufen <em>ist</em> teuer. Kannst es ja mal ausprobieren wenn du meinst dass der Unterschied nicht signifikant wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2449553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2449553</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 09 Apr 2015 00:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Tue, 14 Apr 2015 19:12:28 GMT]]></title><description><![CDATA[<p>Ich würde mich auch an die Eingabe hängen.<br />
Und dazu es nicht per if-if-if machen, sondern im Falle des Treadabbruchwunsches eine Exception werfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450198</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 14 Apr 2015 19:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen unterbrechbar machen, die eigentlich nichts davon wissen (sollen?) on Tue, 14 Apr 2015 19:52:08 GMT]]></title><description><![CDATA[<p>Ok, werd ich dann so machen. Eigentlich muss man ja nur ein Interface nach außen hin anbieten mit dem man abbrechen kann, hab da wohl zu kompliziert gedacht am Anfang <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450205</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 14 Apr 2015 19:52:08 GMT</pubDate></item></channel></rss>