<?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[Verschiedene Probleme mit std::atomic_init]]></title><description><![CDATA[<p>Ich habe gerade mal ein bisschen mit den atomics rumgespielt, Compiler ist GCC 4.8:</p>
<p><strong>Erstes Problem:</strong><br />
Wie nutze ich atomic_init richtig?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;atomic&gt;

int main()
{
  std::vector&lt;std::atomic&lt;int&gt;&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_init(&amp;numbers[i], i);
}
</code></pre>
<p>Das gibt mir:</p>
<pre><code>In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: warning: inline function ‘void std::atomic_init(std::atomic&lt;_ITp&gt;*, _ITp) [with _ITp = int]’ used but never defined [enabled by default]
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/tmp/ccuBLH8i.o: In function `main':
test.cc:(.text.startup+0x40): undefined reference to `void std::atomic_init&lt;int&gt;(std::atomic&lt;int&gt;*, int)'
collect2: error: ld returned 1 exit status
</code></pre>
<p>Muss ich hier noch irgendwas zusätzlich zur Standardbibliothek dazulinken? Ich habe vage Hinweise auf so etwas in der GCC-Wiki gefunden, aber eigentlich stand da auch, dass dies bei 4.8 nicht mehr nötig wäre und wie die Bibliothek heißen sollte, habe ich auch nicht finden können.</p>
<p><strong>Zweites Problem:</strong><br />
Ernsthaft, wie benutzt man std::atomic_init?</p>
<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic_int&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_init(&amp;numbers[i], i);
}
</code></pre>
<p>Gibt mir</p>
<pre><code>test.cc: In function ‘int main()’:
test.cc:9:36: error: no matching function for call to ‘atomic_init(__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type*, int&amp;)’
     std::atomic_init(&amp;numbers[i], i);
                                    ^
test.cc:9:36: note: candidates are:
     std::atomic_init(&amp;numbers[i], i);
                                    ^
In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: note: template&lt;class _ITp&gt; void std::atomic_init(std::atomic&lt;_ITp&gt;*, _ITp)
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: note:   template argument deduction/substitution failed:
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
test.cc:9:36: note:   ‘__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type {aka std::__atomic_base&lt;int&gt;}’ is not derived from ‘std::atomic&lt;_ITp&gt;’
     std::atomic_init(&amp;numbers[i], i);
                                    ^
In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:811:5: note: template&lt;class _ITp&gt; void std::atomic_init(volatile std::atomic&lt;_ITp&gt;*, _ITp)
     atomic_init(volatile atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:811:5: note:   template argument deduction/substitution failed:
     atomic_init(volatile atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
test.cc:9:36: note:   ‘__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type {aka std::__atomic_base&lt;int&gt;}’ is not derived from ‘volatile std::atomic&lt;_ITp&gt;’
     std::atomic_init(&amp;numbers[i], i);
</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="😕"
    /> <code>std::__atomic_base&lt;int&gt;}’ is not derived from ‘std::atomic&lt;_ITp&gt;’</code> Aber atomic_int soll doch ein typedef auf std::atomic&lt;int&gt; sein! Fehler im GCC?</p>
<p><strong>Drittes Problem:</strong><br />
Wozu überhaupt atomic_init?<br />
Wo wäre der Unterschied zu</p>
<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic&lt;int&gt;&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_store(&amp;numbers[i], i);
}
</code></pre>
<p>?<br />
Der letzte Code funktioniert übrigens ganz wunderbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307510/verschiedene-probleme-mit-std-atomic_init</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 18:01:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307510.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Aug 2012 17:20:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschiedene Probleme mit std::atomic_init on Tue, 28 Aug 2012 17:21:20 GMT]]></title><description><![CDATA[<p>Ich habe gerade mal ein bisschen mit den atomics rumgespielt, Compiler ist GCC 4.8:</p>
<p><strong>Erstes Problem:</strong><br />
Wie nutze ich atomic_init richtig?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;atomic&gt;

int main()
{
  std::vector&lt;std::atomic&lt;int&gt;&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_init(&amp;numbers[i], i);
}
</code></pre>
<p>Das gibt mir:</p>
<pre><code>In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: warning: inline function ‘void std::atomic_init(std::atomic&lt;_ITp&gt;*, _ITp) [with _ITp = int]’ used but never defined [enabled by default]
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/tmp/ccuBLH8i.o: In function `main':
test.cc:(.text.startup+0x40): undefined reference to `void std::atomic_init&lt;int&gt;(std::atomic&lt;int&gt;*, int)'
collect2: error: ld returned 1 exit status
</code></pre>
<p>Muss ich hier noch irgendwas zusätzlich zur Standardbibliothek dazulinken? Ich habe vage Hinweise auf so etwas in der GCC-Wiki gefunden, aber eigentlich stand da auch, dass dies bei 4.8 nicht mehr nötig wäre und wie die Bibliothek heißen sollte, habe ich auch nicht finden können.</p>
<p><strong>Zweites Problem:</strong><br />
Ernsthaft, wie benutzt man std::atomic_init?</p>
<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic_int&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_init(&amp;numbers[i], i);
}
</code></pre>
<p>Gibt mir</p>
<pre><code>test.cc: In function ‘int main()’:
test.cc:9:36: error: no matching function for call to ‘atomic_init(__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type*, int&amp;)’
     std::atomic_init(&amp;numbers[i], i);
                                    ^
test.cc:9:36: note: candidates are:
     std::atomic_init(&amp;numbers[i], i);
                                    ^
In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: note: template&lt;class _ITp&gt; void std::atomic_init(std::atomic&lt;_ITp&gt;*, _ITp)
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:807:5: note:   template argument deduction/substitution failed:
     atomic_init(atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
test.cc:9:36: note:   ‘__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type {aka std::__atomic_base&lt;int&gt;}’ is not derived from ‘std::atomic&lt;_ITp&gt;’
     std::atomic_init(&amp;numbers[i], i);
                                    ^
In file included from test.cc:2:0:
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:811:5: note: template&lt;class _ITp&gt; void std::atomic_init(volatile std::atomic&lt;_ITp&gt;*, _ITp)
     atomic_init(volatile atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/../../../../include/c++/4.8.0/atomic:811:5: note:   template argument deduction/substitution failed:
     atomic_init(volatile atomic&lt;_ITp&gt;* __a, _ITp __i) noexcept;
     ^
test.cc:9:36: note:   ‘__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::__atomic_base&lt;int&gt; &gt; &gt;::value_type {aka std::__atomic_base&lt;int&gt;}’ is not derived from ‘volatile std::atomic&lt;_ITp&gt;’
     std::atomic_init(&amp;numbers[i], i);
</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="😕"
    /> <code>std::__atomic_base&lt;int&gt;}’ is not derived from ‘std::atomic&lt;_ITp&gt;’</code> Aber atomic_int soll doch ein typedef auf std::atomic&lt;int&gt; sein! Fehler im GCC?</p>
<p><strong>Drittes Problem:</strong><br />
Wozu überhaupt atomic_init?<br />
Wo wäre der Unterschied zu</p>
<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic&lt;int&gt;&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_store(&amp;numbers[i], i);
}
</code></pre>
<p>?<br />
Der letzte Code funktioniert übrigens ganz wunderbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246408</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 28 Aug 2012 17:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Probleme mit std::atomic_init on Tue, 28 Aug 2012 17:27:02 GMT]]></title><description><![CDATA[<p><code>atomic_init</code> ist im Gegensatz zu <code>atomic_store</code> nicht atomar. Warum es nicht funktioniert, kann ich Dir leider nicht sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246410</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Aug 2012 17:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Probleme mit std::atomic_init on Tue, 28 Aug 2012 17:37:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::atomic_int
</code></pre>
<p>Funktioniert bei mir wunderbar mit VS 2012. Kannst du ja gern ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246412</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 28 Aug 2012 17:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Probleme mit std::atomic_init on Tue, 28 Aug 2012 17:45:34 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::atomic_int
</code></pre>
<p>Funktioniert bei mir wunderbar mit VS 2012. Kannst du ja gern ausprobieren.</p>
</blockquote>
<p>Meinst du den Datentyp an sich (der funktioniert auch wunderbar) oder auch im Zusammenspiel mit den ganzen Funktionstemplates aus atomic (atomic_store und andere funktionieren bei mir auch nur mit std::atomic&lt;X&gt; statt std::atomic_X)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246416</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 28 Aug 2012 17:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verschiedene Probleme mit std::atomic_init on Tue, 28 Aug 2012 18:50:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic_int&gt; numbers(5); 

  for(int i = 0; i &lt; 5; ++i) 
    std::atomic_init(&amp;numbers[i], i); 

  return 0;
}
</code></pre>
<p>Dieses Programm liefert keine Fehlermeldung im Gegensatz zu</p>
<pre><code class="language-cpp">int main()
{
  std::vector&lt;std::atomic&lt;int&gt;&gt; numbers(5);

  for(int i = 0; i &lt; 5; ++i)
    std::atomic_init(&amp;numbers[i], i);
}
</code></pre>
<p>Kann sein, dass der seperate Typ mehr bietet als std::atomic&lt;int&gt;, obwohl es nur ein typdef sein sollte. Ich bin der Sache aber nicht nachgegangen. Komplette Fehlermeldung:</p>
<pre><code>1&gt;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility(2466): error C2248: 'std::atomic&lt;int&gt;::operator =' : cannot access private member declared in class 'std::atomic&lt;int&gt;'
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xxatomic(279) : see declaration of 'std::atomic&lt;int&gt;::operator ='
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xxatomic(254) : see declaration of 'std::atomic&lt;int&gt;'
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility(2487) : see reference to function template instantiation '_OutIt std::_Move&lt;_InIt,_OutIt&gt;(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' being compiled
1&gt;          with
1&gt;          [
1&gt;              _OutIt=std::atomic&lt;int&gt; *,
1&gt;              _InIt=std::atomic&lt;int&gt; *
1&gt;          ]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\vector(1402) : see reference to function template instantiation '_OutIt std::_Move&lt;std::atomic&lt;int&gt;*,std::atomic&lt;int&gt;*&gt;(_InIt,_InIt,_OutIt)' being compiled
1&gt;          with
1&gt;          [
1&gt;              _OutIt=std::atomic&lt;int&gt; *,
1&gt;              _InIt=std::atomic&lt;int&gt; *
1&gt;          ]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\vector(1381) : while compiling class template member function 'std::_Vector_iterator&lt;_Myvec&gt; std::vector&lt;_Ty&gt;::erase(std::_Vector_const_iterator&lt;_Myvec&gt;,std::_Vector_const_iterator&lt;_Myvec&gt;)'
1&gt;          with
1&gt;          [
1&gt;              _Myvec=std::_Vector_val&lt;std::_Simple_types&lt;std::atomic&lt;int&gt;&gt;&gt;,
1&gt;              _Ty=std::atomic&lt;int&gt;
1&gt;          ]
1&gt;          test move.cpp(13) : see reference to class template instantiation 'std::vector&lt;_Ty&gt;' being compiled
1&gt;          with
1&gt;          [
1&gt;              _Ty=std::atomic&lt;int&gt;
1&gt;          ]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2246435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246435</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 28 Aug 2012 18:50:39 GMT</pubDate></item></channel></rss>