<?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[deque Objekt threadsafe?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Ich habe ein Prorgamm zur übertragung von Dateien im Netzwerk geschrieben. Ich habe bisher mit Code::Blocks gearbeitet, versuche aber gerade auf VC++ 2005 Express umzusteigen. Wenn ich mein Programm mit dem VC++ 2005 Express debugge, bekomme ich allerdings einen Fehler der noch nie unter Code::Blocks aufgetreten ist.<br />
Der VC Debugger gibt mir die Fehlermeldung: deque iterator not dereferencable.</p>
<p>Und zwar müsste der Fehler an folgender Stelle auftreten:</p>
<pre><code class="language-cpp">FD_SET fdset;
	__int64 size,recv_size,send_size, prev_time;
	timeval time;
	time.tv_sec = SWITCH_WAIT_TIME_SEC;
	time.tv_usec = SWITCH_WAIT_TIME_USEC;
	char empf_daten[500];
	char send_daten[500];
	fstream dat_transfer;
	fstream debug;
	sockaddr_in sockaddr;
	string buf;
	deque&lt;LIST_DATEN&gt;::iterator i;
	i = liste.end();
	i--;
    stringstream tmp;
	tmp &lt;&lt; &quot;dbglog&quot; &lt;&lt; i-&gt;id &lt;&lt; &quot;.txt&quot;;
	debug.open(tmp.str().c_str(),ios::out);
	debug &lt;&lt; &quot;Init Socket -&gt;&quot; &lt;&lt; flush;
	InitSocket(&amp;(i-&gt;socket));
	debug &lt;&lt; &quot;ok&quot; &lt;&lt; endl;
	if(i-&gt;server)																					//wenn Server
	{
	    debug &lt;&lt; &quot;Server Flag&quot; &lt;&lt; endl;
		SetStatus(i, LISTEN);
		if(!ServerSocket(&amp;(i-&gt;socket), &amp;(i-&gt;listen_socket),i-&gt;port))
		{
			MessageBox(0,&quot;Fehler beim erstellen des Servers&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		recv(i-&gt;socket,empf_daten,255,0);
		buf = empf_daten;
		if(buf == STR_VERSION)
		{
			send(i-&gt;socket, STR_OK.c_str(),255,0);
		}
		else
		{
			send(i-&gt;socket, STR_FALSCHE_VERSION.c_str(),255,0);
			SetStatus(i, FEHLER);
			return 0;
		}

		SetStatus(i, IDLE);
		int addrlen = sizeof(sockaddr_in);
		getpeername(i-&gt;socket, (SOCKADDR*)&amp;sockaddr,&amp;addrlen);					//Ip des Gegenübers festellen
		i-&gt;partner = inet_ntoa(sockaddr.sin_addr);
		SetWindowText(i-&gt;hwnd_conn_partner, (&quot;Verbunden mit: &quot; + i-&gt;partner).c_str());		//Ip setzen
	}
	else																									//wenn Client
	{
	    debug &lt;&lt; &quot;Client Flag&quot; &lt;&lt; endl;
		SetStatus(i, CONNECT);
		if(!ClientSocket(&amp;(i-&gt;socket), const_cast&lt;char*&gt;(i-&gt;partner.c_str()), i-&gt;port))
		{
			MessageBox(0,&quot;Verbindung konnte nicht hergestellt werden&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		else
			SetStatus(i, IDLE);

		send(i-&gt;socket, STR_VERSION.c_str(), 255,0);
		recv(i-&gt;socket, empf_daten, 255, 0); // &lt;- hier tritt der Fehler auf
		buf = empf_daten;
		if(buf != STR_OK)
		{
			MessageBox(0,&quot;Sie benutzen eine andere Version als der Server\nUm Versionskonflikte zu vermeiden, kann keine Verbindung hergestellt werden\nLaden sie sich auf der Seite www.watteimdocht.de die aktuelle Version von Pipe herunter um das Problem zu lösen&quot;,&quot;Fehler: Falsche Version!&quot;,MB_ICONEXCLAMATION);
			SetStatus(i, FEHLER);
			closesocket(i-&gt;socket);
			return 0;
		}
	}
</code></pre>
<p>Zum Programmablauf muss man folgendes wissen:<br />
Das Programm erstellt für jede Verbindung einen eigenen Thread. Also gibt es zum Fehlerzeitpunkt gibt es drei Threads:<br />
Den Gui Thread (WinMain)<br />
Den Server-Thread(s.o. nur der if-Zweig für Server wird ausgeführt)<br />
Der Client-Thread(s.o nur der Client Zweig wird ausgeführt, hier tritt also der besagte Fehler auf).</p>
<p>Nun zu meiner eigentlich Frage: Wie kann es sein das der deque iterator zur Laufzeit im Client-Thread nicht dereferenzierbar ist, ich rufe nirgendwo im Programm deque Funktion wie erase oder ähnlich auf. Kann es sein das ein push_back() das deque Objekt so verändert, das der Iterator ungültig wird. (Das Deque Objekt ist global und wird quasi als Threadübergreifende Verbindungsliste benutzt)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157558/deque-objekt-threadsafe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 12:55:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157558.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Aug 2006 13:18:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to deque Objekt threadsafe? on Sun, 27 Aug 2006 13:18:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Ich habe ein Prorgamm zur übertragung von Dateien im Netzwerk geschrieben. Ich habe bisher mit Code::Blocks gearbeitet, versuche aber gerade auf VC++ 2005 Express umzusteigen. Wenn ich mein Programm mit dem VC++ 2005 Express debugge, bekomme ich allerdings einen Fehler der noch nie unter Code::Blocks aufgetreten ist.<br />
Der VC Debugger gibt mir die Fehlermeldung: deque iterator not dereferencable.</p>
<p>Und zwar müsste der Fehler an folgender Stelle auftreten:</p>
<pre><code class="language-cpp">FD_SET fdset;
	__int64 size,recv_size,send_size, prev_time;
	timeval time;
	time.tv_sec = SWITCH_WAIT_TIME_SEC;
	time.tv_usec = SWITCH_WAIT_TIME_USEC;
	char empf_daten[500];
	char send_daten[500];
	fstream dat_transfer;
	fstream debug;
	sockaddr_in sockaddr;
	string buf;
	deque&lt;LIST_DATEN&gt;::iterator i;
	i = liste.end();
	i--;
    stringstream tmp;
	tmp &lt;&lt; &quot;dbglog&quot; &lt;&lt; i-&gt;id &lt;&lt; &quot;.txt&quot;;
	debug.open(tmp.str().c_str(),ios::out);
	debug &lt;&lt; &quot;Init Socket -&gt;&quot; &lt;&lt; flush;
	InitSocket(&amp;(i-&gt;socket));
	debug &lt;&lt; &quot;ok&quot; &lt;&lt; endl;
	if(i-&gt;server)																					//wenn Server
	{
	    debug &lt;&lt; &quot;Server Flag&quot; &lt;&lt; endl;
		SetStatus(i, LISTEN);
		if(!ServerSocket(&amp;(i-&gt;socket), &amp;(i-&gt;listen_socket),i-&gt;port))
		{
			MessageBox(0,&quot;Fehler beim erstellen des Servers&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		recv(i-&gt;socket,empf_daten,255,0);
		buf = empf_daten;
		if(buf == STR_VERSION)
		{
			send(i-&gt;socket, STR_OK.c_str(),255,0);
		}
		else
		{
			send(i-&gt;socket, STR_FALSCHE_VERSION.c_str(),255,0);
			SetStatus(i, FEHLER);
			return 0;
		}

		SetStatus(i, IDLE);
		int addrlen = sizeof(sockaddr_in);
		getpeername(i-&gt;socket, (SOCKADDR*)&amp;sockaddr,&amp;addrlen);					//Ip des Gegenübers festellen
		i-&gt;partner = inet_ntoa(sockaddr.sin_addr);
		SetWindowText(i-&gt;hwnd_conn_partner, (&quot;Verbunden mit: &quot; + i-&gt;partner).c_str());		//Ip setzen
	}
	else																									//wenn Client
	{
	    debug &lt;&lt; &quot;Client Flag&quot; &lt;&lt; endl;
		SetStatus(i, CONNECT);
		if(!ClientSocket(&amp;(i-&gt;socket), const_cast&lt;char*&gt;(i-&gt;partner.c_str()), i-&gt;port))
		{
			MessageBox(0,&quot;Verbindung konnte nicht hergestellt werden&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		else
			SetStatus(i, IDLE);

		send(i-&gt;socket, STR_VERSION.c_str(), 255,0);
		recv(i-&gt;socket, empf_daten, 255, 0); // &lt;- hier tritt der Fehler auf
		buf = empf_daten;
		if(buf != STR_OK)
		{
			MessageBox(0,&quot;Sie benutzen eine andere Version als der Server\nUm Versionskonflikte zu vermeiden, kann keine Verbindung hergestellt werden\nLaden sie sich auf der Seite www.watteimdocht.de die aktuelle Version von Pipe herunter um das Problem zu lösen&quot;,&quot;Fehler: Falsche Version!&quot;,MB_ICONEXCLAMATION);
			SetStatus(i, FEHLER);
			closesocket(i-&gt;socket);
			return 0;
		}
	}
</code></pre>
<p>Zum Programmablauf muss man folgendes wissen:<br />
Das Programm erstellt für jede Verbindung einen eigenen Thread. Also gibt es zum Fehlerzeitpunkt gibt es drei Threads:<br />
Den Gui Thread (WinMain)<br />
Den Server-Thread(s.o. nur der if-Zweig für Server wird ausgeführt)<br />
Der Client-Thread(s.o nur der Client Zweig wird ausgeführt, hier tritt also der besagte Fehler auf).</p>
<p>Nun zu meiner eigentlich Frage: Wie kann es sein das der deque iterator zur Laufzeit im Client-Thread nicht dereferenzierbar ist, ich rufe nirgendwo im Programm deque Funktion wie erase oder ähnlich auf. Kann es sein das ein push_back() das deque Objekt so verändert, das der Iterator ungültig wird. (Das Deque Objekt ist global und wird quasi als Threadübergreifende Verbindungsliste benutzt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125358</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Sun, 27 Aug 2006 13:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to deque Objekt threadsafe? on Sun, 27 Aug 2006 13:30:51 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if(!ClientSocket(&amp;(i-&gt;socket),     const_cast&lt;char*&gt;      (i-&gt;partner.c_str()), i-&gt;port))
</code></pre>
</blockquote>
<p>Ist nicht dein Ernst oder ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125371</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Sun, 27 Aug 2006 13:30:51 GMT</pubDate></item><item><title><![CDATA[Reply to deque Objekt threadsafe? on Sun, 27 Aug 2006 14:33:22 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<pre><code class="language-cpp">FD_SET fdset;
	__int64 size,recv_size,send_size, prev_time;
	timeval time;
	time.tv_sec = SWITCH_WAIT_TIME_SEC;
	time.tv_usec = SWITCH_WAIT_TIME_USEC;
	char empf_daten[500];
	char send_daten[500];
	fstream dat_transfer;
	fstream debug;
	sockaddr_in sockaddr;
	string buf;
	deque&lt;LIST_DATEN&gt;::iterator i;
	i = liste.end();
	i--;
    stringstream tmp;
	tmp &lt;&lt; &quot;dbglog&quot; &lt;&lt; i-&gt;id &lt;&lt; &quot;.txt&quot;;
	debug.open(tmp.str().c_str(),ios::out);
	debug &lt;&lt; &quot;Init Socket -&gt;&quot; &lt;&lt; flush;
	InitSocket(&amp;(i-&gt;socket));
	debug &lt;&lt; &quot;ok&quot; &lt;&lt; endl;
	if(i-&gt;server)																					//wenn Server
	{
	    debug &lt;&lt; &quot;Server Flag&quot; &lt;&lt; endl;
		SetStatus(i, LISTEN);
		if(!ServerSocket(&amp;(i-&gt;socket), &amp;(i-&gt;listen_socket),i-&gt;port))
		{
			MessageBox(0,&quot;Fehler beim erstellen des Servers&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		recv(i-&gt;socket,empf_daten,255,0);
		buf = empf_daten;
		if(buf == STR_VERSION)
		{
			send(i-&gt;socket, STR_OK.c_str(),255,0);
		}
		else
		{
			send(i-&gt;socket, STR_FALSCHE_VERSION.c_str(),255,0);
			SetStatus(i, FEHLER);
			return 0;
		}

		SetStatus(i, IDLE);
		int addrlen = sizeof(sockaddr_in);
		getpeername(i-&gt;socket, (SOCKADDR*)&amp;sockaddr,&amp;addrlen);					//Ip des Gegenübers festellen
		i-&gt;partner = inet_ntoa(sockaddr.sin_addr);
		SetWindowText(i-&gt;hwnd_conn_partner, (&quot;Verbunden mit: &quot; + i-&gt;partner).c_str());		//Ip setzen
	}
	else																									//wenn Client
	{
	    debug &lt;&lt; &quot;Client Flag&quot; &lt;&lt; endl;
		SetStatus(i, CONNECT);
		if(!ClientSocket(&amp;(i-&gt;socket), const_cast&lt;char*&gt;(i-&gt;partner.c_str()), i-&gt;port))
		{
			MessageBox(0,&quot;Verbindung konnte nicht hergestellt werden&quot;,0,MB_ICONSTOP);
			SetStatus(i, FEHLER);
			return 0;
		}
		else
			SetStatus(i, IDLE);

		send(i-&gt;socket, STR_VERSION.c_str(), 255,0);
		recv(i-&gt;socket, empf_daten, 255, 0); // &lt;- hier tritt der Fehler auf
		buf = empf_daten;
		if(buf != STR_OK)
		{
			MessageBox(0,&quot;Sie benutzen eine andere Version als der Server\nUm Versionskonflikte zu vermeiden, kann keine Verbindung hergestellt werden\nLaden sie sich auf der Seite www.watteimdocht.de die aktuelle Version von Pipe herunter um das Problem zu lösen&quot;,&quot;Fehler: Falsche Version!&quot;,MB_ICONEXCLAMATION);
			SetStatus(i, FEHLER);
			closesocket(i-&gt;socket);
			return 0;
		}
	}
</code></pre>
</blockquote>
<p>Der Code ist nicht dein Ernst, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125421</guid><dc:creator><![CDATA[schlecht...]]></dc:creator><pubDate>Sun, 27 Aug 2006 14:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to deque Objekt threadsafe? on Sun, 27 Aug 2006 15:37:40 GMT]]></title><description><![CDATA[<p>Ja ja ich weiß, der Code ist nicht besonders schön (das hab ich programmiert als ich noch ein absoluter Newbie war). Leider muss ich damit jetzt arbeiten ... ( das Projekt ist zu groß, als das ich größere Codeteile neu schreiben könnte).</p>
<p>Das mit dem const_cast hatte ich gar nicht gesehen ^^, das ist natürlich an der Stelle ein offensichtlicher Fehler, aber leider nicht die Lösung des Problems.<br />
Ich habe das const_cast jetzt weggenommen, und die Funktionsdefinition entsprechend geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125466</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Sun, 27 Aug 2006 15:37:40 GMT</pubDate></item><item><title><![CDATA[Reply to deque Objekt threadsafe? on Mon, 28 Aug 2006 09:53:22 GMT]]></title><description><![CDATA[<p>Also ich entnehme dem schweigem der Menge jetzt einfach mal, dass euch keine Probleme bzg. Threads beim arbeiten mit deques bekannt sind. Ergo, müsste es irgendwo anders im Programm einen Fehler geben. Ich habe mal ein bisschen mehr debugt und festgestellt, das die _mycount Variabel 0 ist während des derreferenzierens in der Angegebenen Zeile. Weiß einer von euch was die _mycount Variabel aussagt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1125972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1125972</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Mon, 28 Aug 2006 09:53:22 GMT</pubDate></item></channel></rss>