<?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[gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird]]></title><description><![CDATA[<p>Servus,</p>
<p>etwas kryptischer Thread-Titel, aber das Problem ist glaube ich schnell erklärt:<br />
Ich habe eine statische Library, von denen eine Klasse einen mutex-lock benötigt. Derzeit ist das über das boost::mutex::scoped_lock implementiert.</p>
<p>Die library wird in eine Applikation gelinkt, in die auch boost_thread reingelinkt wird.</p>
<p>Jetzt möchte ich die library in einer weiteren Applikation verwenden. Diese Applikation basiert auf Qt und ich will nur sehr ungern sowohl Qt als auch boost in selbige linken, zumal es ja auch mutex-implementierungen von Qt gibt.</p>
<p>Was ich jetzt suche ist ein Weg, eine gemeinsame Abstraktion eines &quot;scoped locks&quot; zu haben, der wenn die library zusammen mit boost gelinkt wird, die entsprechende Mutex von boost verwendet, wenn die library hingegen mit Qt gelinkt wird, das entsprechende Qt equivalent.</p>
<p>Wie sollte ich da vorgehen?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263975/gemeinsame-abstraktion-für-ein-scoped-lock-gesucht-das-dann-entweder-von-boost-oder-qt-implementiert-wird</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 12:57:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263975.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Mar 2010 16:02:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:02:31 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>etwas kryptischer Thread-Titel, aber das Problem ist glaube ich schnell erklärt:<br />
Ich habe eine statische Library, von denen eine Klasse einen mutex-lock benötigt. Derzeit ist das über das boost::mutex::scoped_lock implementiert.</p>
<p>Die library wird in eine Applikation gelinkt, in die auch boost_thread reingelinkt wird.</p>
<p>Jetzt möchte ich die library in einer weiteren Applikation verwenden. Diese Applikation basiert auf Qt und ich will nur sehr ungern sowohl Qt als auch boost in selbige linken, zumal es ja auch mutex-implementierungen von Qt gibt.</p>
<p>Was ich jetzt suche ist ein Weg, eine gemeinsame Abstraktion eines &quot;scoped locks&quot; zu haben, der wenn die library zusammen mit boost gelinkt wird, die entsprechende Mutex von boost verwendet, wenn die library hingegen mit Qt gelinkt wird, das entsprechende Qt equivalent.</p>
<p>Wie sollte ich da vorgehen?</p>
<p>Gruß,<br />
Phil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875586</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:02:31 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:09:46 GMT]]></title><description><![CDATA[<p>Eigene Klasse schreiben die nur als Interface dient.<br />
Die Klasse leitest du dann ab und implementierst jeweils den boost und qt mutex dahinter.<br />
Dann kannst du einfach über Präprozessor defines festlegen welche genommen werden soll.</p>
<pre><code class="language-cpp">class MyScopedLock
{
// blub
};

class MyBoostScopedLock : MyScopedLock
{
// blub
};

class MyQtScopedLock : MyScopedLock
{
// blub
};

// ...

#ifdef USE_BOOST
#include &quot;MyBoostScopedLock.h&quot;
#else
#include &quot;MyQtScopedLock.h&quot;
#endif

// ...

#ifdef USE_BOOST
MyBoostScopedLock lock;
#else
MyQtScopedLock lock;
#endif
</code></pre>
<p>Hmm... das Ableiten von einer gemeinsamen Klasse könntest du dir auf die Weise auch sparen, macht es aber meiner Meinung nach übersichtlicher bzw. klarer um was es geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875596</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:09:46 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:15:28 GMT]]></title><description><![CDATA[<p>Interface definieren, zwei verschiedene Implementationen basierend auf Qt bzw. boost anbieten und jeweils entsprechend linken. Den Vorschlag von blub halte ich fuer bloed, da der gesammte Quelltext geaendert werden muss, falls man Qt benutzen will, wenn man vorher boost hatte oder aber mit defines sich den Quelltext beschmiert. (jaja, es gibt typedef ...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875604</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:18:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
Ich sehe da jetzt nicht wirklich einen Unterschied:<br />
Bei meinem Beispiel wird auch einfach nur das passende gelinkt.<br />
Außerdem kann man ja das Interface der MyScopedLock Klasse wenn man mag genau so gestalten wie das des boost::scoped_lock, oder eben entsprechend dem Qt Scoped Lock, je nachdem was zuerst verwendet wurde.<br />
Ich gehe dabei jetzt davon aus das nur eine der beiden Implementationen bisher geschrieben wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875607</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:24:50 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Interface definieren, zwei verschiedene Implementationen basierend auf Qt bzw. boost anbieten und jeweils entsprechend linken. Den Vorschlag von blub halte ich fuer bloed, da der gesammte Quelltext geaendert werden muss, falls man Qt benutzen will, wenn man vorher boost hatte oder aber mit defines sich den Quelltext beschmiert. (jaja, es gibt typedef ...)</p>
</blockquote>
<p>Aber wenn man ein &quot;Interface implementiert&quot; muss man ja immer über einen pointer oder eine Referenz auf das Interface zugreifen, damit man in der korrekten abgeleiteten Klasse landet. Der Trick von boost::mutex::scoped_lock ist ja aber gerade, dass man ein Objekt auf dem Stack anlegt, und keinen Pointer auf ein Heap-Objekt, damit es gerade beim verlassen des scopes aufgeräumt wird.<br />
Außerdem kann ich nicht mit defines im Code der library arbeiten, denn die will ich nur einmal kompilieren. Ich will nicht zwei versionen der library kompileren und zum linken anbieten, sondern EINE einzige library, deren mutex-implementierung dadurch entschieden wird was man noch ZUSÄTZLICH hinzu linkt.</p>
<p>Ich hoffe, ich habe mich verständlich ausgedrückt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875609</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:24:50 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:47:15 GMT]]></title><description><![CDATA[<p>Und seit wann genau liegen Referenzen nicht auf dem Stack?</p>
<pre><code class="language-cpp">class foo
{
public: virtual void bla(){};
		virtual ~foo() = 0 {};
};

class bar1 : public foo
{
public: void bla(){ cout &lt;&lt; &quot;bla1\n&quot;; }
		~bar1(){ cout &lt;&lt; &quot;dtor bar1\n&quot;; }
};

class bar2 : public foo
{
public: void bla(){ cout &lt;&lt; &quot;bla2\n&quot;; }
		~bar2(){ cout &lt;&lt; &quot;dtor bar2\n&quot;; }
};

void blub()
{
	foo &amp;f1 = bar1();

	f1.bla();

	foo &amp;f2 = bar2();

	f2.bla();
}

int main()
{
	blub();

	_getch();

	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>bla1
bla2
dtor bar2
dtor bar1
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1875623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875623</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:47:15 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 16:55:10 GMT]]></title><description><![CDATA[<blockquote>
<p>&quot;Interface implementiert&quot;</p>
</blockquote>
<p>Interface ist einfach nur eine gemeinsame Schnittstelle, nix mit virtual oder Vererbung.</p>
<blockquote>
<p>will ich .. Ich will</p>
</blockquote>
<p>Das, was du willst, geht nicht. Linken ist nach dem Kompilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875626</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Mar 2010 16:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 17:59:32 GMT]]></title><description><![CDATA[<p>Also wie ich es &quot;zaubern&quot; soll, das in</p>
<pre><code class="language-cpp">foo&amp; f1 = bar1();
</code></pre>
<p>bar1() in einem teil des Projektes magisch durch &quot;bar2()&quot; ersetzt wird, entzieht sich leider meiner Kenntnis.</p>
<p>Ich weiß sehrwohl dass die Linkzeit nach der Kompilierzeit ist und nur gelinkt wird, was schon fertig kompiliert ist.</p>
<p>Ich habe mir jetzt folgendermaßen beholfen:<br />
Im Quellcode überall boost::mutex durch Mutex und boost::mutex::scoped_lock durch ein LOCK() Makro ersetzt.</p>
<p>Folgenden Header habe ich mir konstruiert:</p>
<pre><code class="language-cpp">#ifdef USE_BOOST_MUTEX
    #include &lt;boost/thread.hpp&gt;
    typedef boost::mutex Mutex;
    #define LOCK(_x) (boost::mutex::scoped_lock(_x))
#elif USE_QMUTEX
    #include &lt;QMutexLocker&gt;
    typedef QMutex Mutex;
    #define LOCK(_x) (QMutexLocker(&amp;_x))
#else
    #error No Mutex declaration defined
#endif
</code></pre>
<p>Mit typedefs allein ist es nicht zu machen, da QMutexLocker einen Pointer erwartet, boost aber eine Referenz. Daher das blöde Makro.</p>
<p>Jetzt kompiliere ich den Krempel zweimal durch und erhalte zwei statische libraries, einmal mit Qt-Mutexen, einmal mit Boost-Mutexen, und die linke ich in meine zwei Applikaitonen.</p>
<p>Das funktioniert jetzt erstmal.</p>
<p>Meine Frage belibt trotzdem, ob es keine elegantere Lösung gibt, etwa beide implementierungen zu bauen und beide in eine einzige statische library zu packen, wobei erst beim linken der applikation die eine oder andere object-Datei aus der statischen lib genutzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875667</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Tue, 30 Mar 2010 17:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 18:11:09 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Folgenden Header habe ich mir konstruiert:</p>
</blockquote>
<p>Achtung, Bezeichner mit führendem Unterstrich sind für den Compiler reserviert.</p>
<blockquote>
<p>Meine Frage belibt trotzdem, ob es keine elegantere Lösung gibt, etwa beide implementierungen zu bauen und beide in eine einzige statische library zu packen, wobei erst beim linken der applikation die eine oder andere object-Datei aus der statischen lib genutzt wird.</p>
</blockquote>
<p>Wenn das irgendwie geht, was ich bezweifle, dann ist es auf jeden Fall vom verwendeten Compiler (bzw. Linker) abhängig. Das hat nicht mehr unbedingt was mit C++ zu tun.</p>
<p>Das übliche Vorgehen ist es, zwei verschiedene Libs zu bauen. Bei MSVC könntest du dann per Preprocessor die jeweilige Lib auswählen:</p>
<pre><code class="language-cpp">#ifdef USE_BOOST_MUTEX
    #include &quot;boostmutex.h&quot;
    #pragma comment(lib, &quot;boostmutex.lib&quot;)
#elif USE_QMUTEX
    #include &quot;qtmutex.h&quot;
    #pragma comment(lib, &quot;qtmutex.lib&quot;)
#else
    #error No Mutex declaration defined
#endif
</code></pre>
<p>Bei anderen Compilern vermutlich per makefile...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875674</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Tue, 30 Mar 2010 18:11:09 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 18:58:30 GMT]]></title><description><![CDATA[<p>Strategypattern?</p>
<p>Eigentlich würde ich aber auf eine Threadinglibrary setzen, und boost::thread ist da näher am Standard.<br />
Qt mag auf mehr Plattformen als boost laufen, aber wenn dass wichtig ist, entwickelt man sowieso Qt only.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875696</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Tue, 30 Mar 2010 18:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to gemeinsame Abstraktion für ein scoped-Lock gesucht, das dann entweder von boost oder Qt implementiert wird on Tue, 30 Mar 2010 19:04:20 GMT]]></title><description><![CDATA[<p>Mach halt deine eigene Scoped-Lock Klasse, die eben NICHT auf Boost/Qt Scoped-Locks basiert, sondern &quot;zu fuss&quot; die entsprechenden Lock/Unlock Funktionen aufruft.</p>
<p>Oder noch besser: mach deine Mutexen mit den Scoped-Locks von Boost kompatibel, und verwende überall die.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875699</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Mar 2010 19:04:20 GMT</pubDate></item></channel></rss>