<?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[thread_local in global scope]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe folgenden Code-Schnipsel:</p>
<pre><code class="language-cpp">namespace network{
    namespace detail{
        struct ssl_initializer{
            ssl_initializer(){
...
            }

            ~ssl_initializer(){
...
            }
        };

        thread_local static const ssl_initializer ssl_init;
    }
}
</code></pre>
<p>Das <code>static</code> ist laut dem Standard redundant. Aber darum gehts hier nicht. Das Problem ist, ich binde den Header ein, wo dieser Code steht, aber es wird keine Instanz von <code>ssl_initializer</code> instanziert. Wenn ich das <code>thread_local</code> weglasse, klappt es dann. Laut Standard steht da aber folgendes:</p>
<blockquote>
<p>The storage for these entities shall last for the duration of the thread in which they are created</p>
</blockquote>
<p>Also, das impliziert für mich, dass die Instanz vom Thread-Beginn aus, bis zum Thread-Ende lebt. Wenn ich das Programm starte, habe ich doch einen Main Thread! Also warum wird die Instanz dann nicht instanziert? Ich habe auch schon folgendes versucht, um mögliche Compiler-Optimierungen auszuschließen:</p>
<pre><code class="language-cpp">thread_local static const volatile ssl_initializer ssl_init;
</code></pre>
<p>Keine Chance.<br />
Wenn ich nun jedoch in die <code>main()</code> -Funktion hingehe, und folgendes in die erste Zeile schreibe:</p>
<pre><code class="language-cpp">(void)network::detail::ssl_init;
</code></pre>
<p>Dann klappt es, dann ist die Variable erstellt worden. Aber andersrum nicht. Wie ist das zu verstehen?<br />
Wo ist mein Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339136/thread_local-in-global-scope</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 16:39:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339136.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Aug 2016 20:38:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 20:38:01 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe folgenden Code-Schnipsel:</p>
<pre><code class="language-cpp">namespace network{
    namespace detail{
        struct ssl_initializer{
            ssl_initializer(){
...
            }

            ~ssl_initializer(){
...
            }
        };

        thread_local static const ssl_initializer ssl_init;
    }
}
</code></pre>
<p>Das <code>static</code> ist laut dem Standard redundant. Aber darum gehts hier nicht. Das Problem ist, ich binde den Header ein, wo dieser Code steht, aber es wird keine Instanz von <code>ssl_initializer</code> instanziert. Wenn ich das <code>thread_local</code> weglasse, klappt es dann. Laut Standard steht da aber folgendes:</p>
<blockquote>
<p>The storage for these entities shall last for the duration of the thread in which they are created</p>
</blockquote>
<p>Also, das impliziert für mich, dass die Instanz vom Thread-Beginn aus, bis zum Thread-Ende lebt. Wenn ich das Programm starte, habe ich doch einen Main Thread! Also warum wird die Instanz dann nicht instanziert? Ich habe auch schon folgendes versucht, um mögliche Compiler-Optimierungen auszuschließen:</p>
<pre><code class="language-cpp">thread_local static const volatile ssl_initializer ssl_init;
</code></pre>
<p>Keine Chance.<br />
Wenn ich nun jedoch in die <code>main()</code> -Funktion hingehe, und folgendes in die erste Zeile schreibe:</p>
<pre><code class="language-cpp">(void)network::detail::ssl_init;
</code></pre>
<p>Dann klappt es, dann ist die Variable erstellt worden. Aber andersrum nicht. Wie ist das zu verstehen?<br />
Wo ist mein Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504659</guid><dc:creator><![CDATA[snipps]]></dc:creator><pubDate>Thu, 04 Aug 2016 20:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 20:46:41 GMT]]></title><description><![CDATA[<p>Wie stellst du das fest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504660</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 04 Aug 2016 20:46:41 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 20:52:44 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Wie stellst du das fest?</p>
</blockquote>
<p>Mit dem Debugger.<br />
Außerdem bekomme ich SSL-Errors, weil die Library nicht initialisiert worden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504661</guid><dc:creator><![CDATA[snipps]]></dc:creator><pubDate>Thu, 04 Aug 2016 20:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 20:57:05 GMT]]></title><description><![CDATA[<p>Hier zwei Beispiel-Codes.</p>
<p><a href="http://ideone.com/ELvjd0" rel="nofollow">Einmal klappts nicht...</a><br />
<a href="http://ideone.com/BYCa8a" rel="nofollow">...Und einmal klappts</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504662</guid><dc:creator><![CDATA[snipps]]></dc:creator><pubDate>Thu, 04 Aug 2016 20:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 21:26:03 GMT]]></title><description><![CDATA[<p>snipps schrieb:</p>
<blockquote>
<blockquote>
<p>The storage for these entities shall last for the duration of the thread in which they are created</p>
</blockquote>
</blockquote>
<p>Ein paar Zeilen später steht im Standard noch das hier:</p>
<p>[basic.stc.thread] schrieb:</p>
<blockquote>
<p>A variable with thread storage duration shall be initialized before its first odr-use and, if constructed, shall be destroyed on thread exit.</p>
</blockquote>
<p>Zumindest der Konstruktor-Aufruf des TLS-Objekts darf also auch erst unmittelbar vor der ersten Benutzung passieren, der genaue Zeitpunkt ist undefiniert.</p>
<p>Den von dir zitierten Satz würde ich so interpretieren, daß nur der Speicher für das Objekt schon ab Thread-Erzeugung alloziert sein muß. Keine Ahnung, ob das dann noch wirklich eine Rolle spielt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504664</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Thu, 04 Aug 2016 21:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 21:32:10 GMT]]></title><description><![CDATA[<p>snipps schrieb:</p>
<blockquote>
<blockquote>
<p>The storage for these entities shall last for the duration of the thread in which they are created</p>
</blockquote>
<p>Also, das impliziert für mich, dass die Instanz vom Thread-Beginn aus, bis zum Thread-Ende lebt.</p>
</blockquote>
<p>Es bedeutet nur, dass der Speicherbereich von Beginn an reserviert ist, wann die Initialisierung erfolgt, ergibt sich daraus nicht. Es ist der Implementation überlassen, diese irgendwann vor der ersten ODR-nutzung durchzuführen.<br />
z.B.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct beispiel{
    beispiel(){
        std::cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; std::endl;
    }
};

thread_local beispiel bsp;
auto&amp; foo = bsp;

int main(){
}
</code></pre>
<p>wäre möglich, erledigt aber nat. nur die frühzeitige Initialisierung im Hauptthread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504666</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 04 Aug 2016 21:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to thread_local in global scope on Thu, 04 Aug 2016 21:41:42 GMT]]></title><description><![CDATA[<p>Ok, danke euch.<br />
Dann mach ich halt noch so ne Dummy-Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2504667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2504667</guid><dc:creator><![CDATA[snipps]]></dc:creator><pubDate>Thu, 04 Aug 2016 21:41:42 GMT</pubDate></item></channel></rss>