<?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[ostream &#x2F;streambuf erweitern]]></title><description><![CDATA[<p>Ich hab folgendes kleines Problem, vielleicht hat ja jemand eine Idee wie man das angehn könnte:</p>
<p>Ich arbeite in einem Programm mit mehreren Threads, die alle Ausgaben an std::ostreams (z.B. auch cout) geben wollen. Ich hätte dafür gerne eine Art blockierenden Stream. Meine Überlegung war bisher, den Stream mit einem Mutex zu versehen, der jedesmal beim Aufruf des op&lt;&lt; gelockt wird. Der Mutex müsste für das Hintereinanderschalten die Eigenschaft haben, dass er vom selben Thread mehrmals gelockt werden kann und die gesamtem Locks mit einem Unlock wieder abgeräumt werden können. Die Mutexklasse dafür habe ich schon. Die Ausgabe sollte dnn im Code möglichst ähnlich wie hier sein:</p>
<pre><code class="language-cpp">int foo()
{
  lockedcout &lt;&lt; i /*hier hat sich op&lt;&lt; den lock geholt */ 
             &lt;&lt; &quot; Hello World&quot; 
             &lt;&lt; setprecision(4) 
             &lt;&lt; setw(10) 
             &lt;&lt; 5.0;  
             &lt;&lt; endl;//schon 6mal gelockt...
  int y = berechneY(); //(Stream ist immernoch gelockt...) 
  bar();

  lockedcout &lt;&lt; &quot;geht weiter...&quot;;
  lockedcout &lt;&lt; &quot;und weiter...&quot;;
  lockedcout &lt;&lt; &quot;und jetzt ist Schluss!&quot; &lt;&lt; endl &lt;&lt; unlock; //jetzt dürfen endlich andere Threads...
}
</code></pre>
<p>Das Problem ist folgendes:<br />
Ich hätte die Klasse gern als Ableitung von std::ostream, wegen der Manipulatoren und allem anderen. Außerdem würde ich am Liebsten einfach bestehende Streams (wie z.B. cout) mit dieser Funktionalität nachrüsten können.<br />
Das hat mich jetzt darauf gebracht, dass ich dann wohl vermutlich quasi eine Ableitung von streambuf brauche, in der sich das Locken versteckt und die aber alle Eingaben an einen anderen streambuf weitervergibt, den sie quasi &quot;gekapert&quot; hat. Im Grunde wäre das sone Art Decorator, den man vor den vorhandenen Buffer klemmt.<br />
Das Problem was ich jetzt seh: Die nichtvirtuellen Funktionen von streambuf würden sich damit nur auf meinen streambuf auswirken, nicht aber auf den der die eigentliche Arbeit verrichtet. Hat jemand ne Idee wie man das hinbiegen kann?</p>
<p>};</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262427/ostream-streambuf-erweitern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 16:13:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262427.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Mar 2010 18:44:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ostream &#x2F;streambuf erweitern on Fri, 05 Mar 2010 18:44:40 GMT]]></title><description><![CDATA[<p>Ich hab folgendes kleines Problem, vielleicht hat ja jemand eine Idee wie man das angehn könnte:</p>
<p>Ich arbeite in einem Programm mit mehreren Threads, die alle Ausgaben an std::ostreams (z.B. auch cout) geben wollen. Ich hätte dafür gerne eine Art blockierenden Stream. Meine Überlegung war bisher, den Stream mit einem Mutex zu versehen, der jedesmal beim Aufruf des op&lt;&lt; gelockt wird. Der Mutex müsste für das Hintereinanderschalten die Eigenschaft haben, dass er vom selben Thread mehrmals gelockt werden kann und die gesamtem Locks mit einem Unlock wieder abgeräumt werden können. Die Mutexklasse dafür habe ich schon. Die Ausgabe sollte dnn im Code möglichst ähnlich wie hier sein:</p>
<pre><code class="language-cpp">int foo()
{
  lockedcout &lt;&lt; i /*hier hat sich op&lt;&lt; den lock geholt */ 
             &lt;&lt; &quot; Hello World&quot; 
             &lt;&lt; setprecision(4) 
             &lt;&lt; setw(10) 
             &lt;&lt; 5.0;  
             &lt;&lt; endl;//schon 6mal gelockt...
  int y = berechneY(); //(Stream ist immernoch gelockt...) 
  bar();

  lockedcout &lt;&lt; &quot;geht weiter...&quot;;
  lockedcout &lt;&lt; &quot;und weiter...&quot;;
  lockedcout &lt;&lt; &quot;und jetzt ist Schluss!&quot; &lt;&lt; endl &lt;&lt; unlock; //jetzt dürfen endlich andere Threads...
}
</code></pre>
<p>Das Problem ist folgendes:<br />
Ich hätte die Klasse gern als Ableitung von std::ostream, wegen der Manipulatoren und allem anderen. Außerdem würde ich am Liebsten einfach bestehende Streams (wie z.B. cout) mit dieser Funktionalität nachrüsten können.<br />
Das hat mich jetzt darauf gebracht, dass ich dann wohl vermutlich quasi eine Ableitung von streambuf brauche, in der sich das Locken versteckt und die aber alle Eingaben an einen anderen streambuf weitervergibt, den sie quasi &quot;gekapert&quot; hat. Im Grunde wäre das sone Art Decorator, den man vor den vorhandenen Buffer klemmt.<br />
Das Problem was ich jetzt seh: Die nichtvirtuellen Funktionen von streambuf würden sich damit nur auf meinen streambuf auswirken, nicht aber auf den der die eigentliche Arbeit verrichtet. Hat jemand ne Idee wie man das hinbiegen kann?</p>
<p>};</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864904</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Mar 2010 18:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to ostream &#x2F;streambuf erweitern on Fri, 05 Mar 2010 19:23:56 GMT]]></title><description><![CDATA[<p>Erscheint mir irgendwie nicht so sinnvoll zu sein, aus mehreren Gründen:<br />
1. Das mehrfache locken bei jeder Ausgabe.<br />
2. Wie sieht es mit der Fehlersicherheit aus? Bei einer Exception würde bei deinem Code der Stream nie mehr freigegeben werden.<br />
3. Gehört sowas wirklich in den Stream?</p>
<p>Eine Idee hätte ich, ist aber keine vollwertige Lösung, da mir ein paar zusätzliche Informationen fehlen:</p>
<pre><code class="language-cpp">void foo()
{
  StreamLock lock;
  std::ostream&amp; os = lock.getStream();

  os &lt;&lt; &quot;Bla bla usw. usf.&quot;;
}
</code></pre>
<p>StreamLock müsste sich halt irgendwoher den Stream holen können. Gäbe da viele unterschiedliche Möglichkeiten. Ganz simple zum Beispiel:</p>
<pre><code class="language-cpp">class StreamLock
{
  // Static attributes //
private:
  static std::ostream stream;

  // Static functions //
public:
  static void setStreamBuffer(std::streambuf* buffer)
  {
    if(buffer)
    {
      stream.rdbuf(buffer);
    }
    else
    {
      stream.rdbuf(std::cout.rdbuf());
    }
  }

  // Constructor mit lock usw. usf. //

  // Methods //
public:
  std::ostream&amp; getStream() { return stream; }
};
</code></pre>
<p>Könntest aber auch über eine <code>std::map</code> arbeiten und entsprechende Konstanten oder einem Array und einem Enum.</p>
<p>Einfach mal so eine/ein paar Ideen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864928</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 05 Mar 2010 19:23:56 GMT</pubDate></item><item><title><![CDATA[Reply to ostream &#x2F;streambuf erweitern on Fri, 05 Mar 2010 19:57:53 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis mit der Exceptionsicherheit zum Unlocken.<br />
Ich hab mir jetzt folgendes überlegt:<br />
- ich baue mit <a href="http://www.boost.org/doc/libs/1_42_0/libs/iostreams/doc/index.html" rel="nofollow">boost::iostreams</a> einen allgemeingültigen Filter, der einfach alles durchwinkt was kommt, solang er sein Lock besitzt, andernfalls blockt und drauf wartet dass ers bekommt.<br />
- ich schreibe eine Funktion, die einen beliebigen Stream annimmt und ihm den Filter vor seinen streambuf hängt.<br />
- ich schreibe den manipulator unlock, der schaut ob der stream einen entsprechend gefilterten Streambuf hat und dessen Lock freigibt<br />
- für die Exceptionsicherheit gibts eine Klasse die nichts tut als im Destruktor ein unlock in den übergebenen Stream zu stecken.</p>
<p>- ich bin gespannt ob das funktioniert und obs noch performant genug ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864944</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Mar 2010 19:57:53 GMT</pubDate></item><item><title><![CDATA[Reply to ostream &#x2F;streambuf erweitern on Fri, 05 Mar 2010 20:05:11 GMT]]></title><description><![CDATA[<p>Also ich würde das nicht die ganze zeit gelockt lassen. Nur weil es um eine Ausgabe geht. Ich würde da eher einen ostringstream nehmen und wenn der zerstört wird schreibt er es in den target stream auf einmal und lockt dabei den stream.</p>
<p>Nur so ein Gedanke. Weil wenn du mehrere threads gleichzeitig da mit verwendest hast du das problem das du dein programm ausbremst. Edit: Natürlich nur wenn du viele ausgaben machst und das in vielen threads.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864949</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Fri, 05 Mar 2010 20:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to ostream &#x2F;streambuf erweitern on Fri, 05 Mar 2010 22:56:31 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<p>Edit: Natürlich nur wenn du viele ausgaben machst und das in vielen threads.</p>
</blockquote>
<p>Wird hauptsächlich Ausgaben aus einem Thread geben, aus nem zweiten kommt hin und wieder was, aber nicht sehr häufig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865019</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 05 Mar 2010 22:56:31 GMT</pubDate></item></channel></rss>