<?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[std::map threadsafe verwenden?]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich möchte unter Windows eine std::map threadsafe verwenden.</p>
<pre><code class="language-cpp">struct Data
{
	LPWSABUF lpBuffer;
	DWORD timeStamp;
};

Data tempQueueEntry;
map&lt;LPOVERLAPPED, Data&gt; queue;
map&lt;LPOVERLAPPED, Data&gt;::iterator queueIterator;
</code></pre>
<p>Folgender code könnte mehrmals gleichzeitig aufgerufen werden:</p>
<pre><code class="language-cpp">tempQueueEntry.lpBuffer = lpBuffer;
tempQueueEntry.timeStamp = timeGetTime();

queue.insert(pair&lt;LPOVERLAPPED, Data&gt;(lpOverlapped, tempQueueEntry));
</code></pre>
<p>und</p>
<pre><code class="language-cpp">queueIterator = queue.find(lpOverlapped);
if(queueIterator != queue.end())
{
	// Manipulate buffer
	// ...

	queue.erase(queueIterator);
}

// Delete expired entries
for(queueIterator = queue.begin(); queueIterator != queue.end(); )
{
	if(timeGetTime() - queueIterator-&gt;second.timeStamp &gt; 5000)
		queue.erase(queueIterator++);
	else
		++queueIterator;
}
</code></pre>
<p>Aber wie mache ich das richtig? Müsste ich mich da mit den ganzen Thread-Techniken beschäftigen? Ist das sehr kompliziert? Oder gibt es für mein Problem eine einfache Lösung?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207757/std-map-threadsafe-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 08:46:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207757.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Mar 2008 14:10:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 14:10:24 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich möchte unter Windows eine std::map threadsafe verwenden.</p>
<pre><code class="language-cpp">struct Data
{
	LPWSABUF lpBuffer;
	DWORD timeStamp;
};

Data tempQueueEntry;
map&lt;LPOVERLAPPED, Data&gt; queue;
map&lt;LPOVERLAPPED, Data&gt;::iterator queueIterator;
</code></pre>
<p>Folgender code könnte mehrmals gleichzeitig aufgerufen werden:</p>
<pre><code class="language-cpp">tempQueueEntry.lpBuffer = lpBuffer;
tempQueueEntry.timeStamp = timeGetTime();

queue.insert(pair&lt;LPOVERLAPPED, Data&gt;(lpOverlapped, tempQueueEntry));
</code></pre>
<p>und</p>
<pre><code class="language-cpp">queueIterator = queue.find(lpOverlapped);
if(queueIterator != queue.end())
{
	// Manipulate buffer
	// ...

	queue.erase(queueIterator);
}

// Delete expired entries
for(queueIterator = queue.begin(); queueIterator != queue.end(); )
{
	if(timeGetTime() - queueIterator-&gt;second.timeStamp &gt; 5000)
		queue.erase(queueIterator++);
	else
		++queueIterator;
}
</code></pre>
<p>Aber wie mache ich das richtig? Müsste ich mich da mit den ganzen Thread-Techniken beschäftigen? Ist das sehr kompliziert? Oder gibt es für mein Problem eine einfache Lösung?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472111</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 14:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 14:21:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber wie mache ich das richtig?</p>
</blockquote>
<p>Ein Möglichkeit (unter Windows) ist die Map mit Critical Sections zu schützen.</p>
<blockquote>
<p>Müsste ich mich da mit den ganzen Thread-Techniken beschäftigen?</p>
</blockquote>
<p>Auf jedenfall.</p>
<blockquote>
<p>Ist das sehr kompliziert?</p>
</blockquote>
<p>Nein.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472117</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 11 Mar 2008 14:21:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 14:23:37 GMT]]></title><description><![CDATA[<p>Was für eine STL Library verwendest Du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472118</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 11 Mar 2008 14:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 15:02:15 GMT]]></title><description><![CDATA[<p>C++ STL</p>
<p>Ich werd mir mal critical sections ansehen.<br />
Jedoch ist da so ne Sache:<br />
Ein Thread darf keinesfalls lange angehalten werden, da dieser Thread mit einem Netzwerkstrom zusammenhängt (Ein Durchgang eines jeden Threads ist schnell genug).<br />
Sind critical sections schnell, oder gibt es ne schnellere Möglichkeit?</p>
<p>Danke!<br />
MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472162</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 15:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 15:11:04 GMT]]></title><description><![CDATA[<p>Für Windows sind Critical Section (soweit cih weiss) die schnellsten Lock's.</p>
<p>Ich meinte die Implementierung der STL, z.B. die von Microsoft.<br />
Ich denke nach dem Erase aus der Map wird der Iterator ungültig. Und die MS STL Impl. hat bei Erase einen nicht Standardkonformen Rückgabewert.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472177</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 11 Mar 2008 15:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 15:35:36 GMT]]></title><description><![CDATA[<p>Aha, okay.</p>
<p>Achso, danke für den Tipp, aber wenn du genau hinsiehst, mache ich es so:</p>
<p>queue.erase(queueIterator++);</p>
<p>Dabei wird doch zuerst ein temporäres Objekt, welches queueIterator darstellt, dem erase() übergeben und anschließend wird queueIterator inkrementiert. Sollte also hinhauen.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472218</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 15:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 15:47:24 GMT]]></title><description><![CDATA[<p>Öh und pro thread braucht man ein eigenes CRITICAL_SECTION- Objekt, richtig? Scheint sehr logisch, frage aber halt zur Sicherheit nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472230</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 15:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 15:51:25 GMT]]></title><description><![CDATA[<p>ceplusplus@loggedoff schrieb:</p>
<blockquote>
<p>Öh und pro thread braucht man ein eigenes CRITICAL_SECTION- Objekt, richtig? Scheint sehr logisch, frage aber halt zur Sicherheit nach.</p>
</blockquote>
<p>Nein, nicht pro Thread, sondern pro Objekt welches geschützt werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472235</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 11 Mar 2008 15:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 16:23:10 GMT]]></title><description><![CDATA[<p>Ist es denn so richtig?</p>
<pre><code class="language-cpp">// Codeblock 1

// criticalSection1  schützt  tempQueueEntry
EnterCriticalSection(&amp;criticalSection1);
tempQueueEntry.lpBuffer = lpBuffer;
tempQueueEntry.timeStamp = timeGetTime();
LeaveCriticalSection(&amp;criticalSection1);

// criticalSection2  schützt  queue
EnterCriticalSection(&amp;criticalSection2);
queue.insert(pair&lt;LPOVERLAPPED, Data&gt;(lpOverlapped, tempQueueEntry));
LeaveCriticalSection(&amp;criticalSection2);
</code></pre>
<pre><code class="language-cpp">// Codeblock 2

// criticalSection2  schützt  queue
EnterCriticalSection(&amp;criticalSection2);

queueIterator = queue.find(lpOverlapped);
if(queueIterator != queue.end())
{
    // Blubb
    // ...

	queue.erase(queueIterator);
}

for(queueIterator = queue.begin(); queueIterator != queue.end(); )
{
	if(timeGetTime() - queueIterator-&gt;second.timeStamp &gt; 5000)
		queue.erase(queueIterator++);
	else
		++queueIterator;
}

LeaveCriticalSection(&amp;criticalSection2);
</code></pre>
<p>Beide Codeblocks könnten mehrfach gleichzeitig laufen, also zB. 2x Codeblock1 und 3x Codeblock2 gleichzeitig.<br />
Kommt es da nicht zu Problemen?</p>
<p>Im zweiten Codeblock muss queueIterator nicht geschützt werden, dafür aber queue, welches auch in Codeblock1 geschützt ist.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472257</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 16:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::map threadsafe verwenden? on Tue, 11 Mar 2008 16:52:09 GMT]]></title><description><![CDATA[<p>Oh mist, sorry.<br />
Im zweiten Codeblock muss queueIterator natürlich auch geschützt werden, da dieser Block auch mehrfach ausgeführt werden könnte.</p>
<p>Kann ich das so lassen oder muss ich noch eine weitere CS erstellen?</p>
<p>zB.</p>
<pre><code class="language-cpp">// criticalSection2  schützt  queue
EnterCriticalSection(&amp;criticalSection2);
// criticalSection3  schützt  queueIterator
EnterCriticalSection(&amp;criticalSection3);

...
</code></pre>
<p><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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1472267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1472267</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Tue, 11 Mar 2008 16:52:09 GMT</pubDate></item></channel></rss>