This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: g++ 5.3 AIX call_once issues


On Tue, Oct 31, 2017 at 7:15 AM, Bob Wilkinson
<bob.wilkinson@cristie.com> wrote:
> On Mon, Oct 30, 2017 at 10:22:03AM -0400, Brian Groose wrote:
>> Hi Bob,
>>
>> Yes, I have -pthread, in fact, it won't even compile (much less try to
>> link) because the declaration isn't visible without -pthread.
>> I verified that the linker is looking at the pthread version of libstdc++.a
>> as well, which shows the type "L" AIX TLS symbols when I run nm on it.
>>
>> I've tried compiling gcc without and without --enable-tls, which doesn't
>> seem to make any difference.
>
> Hello Brian
>
> I have never used call_once ... so I found a demo program at http://www.cplusplus.com/reference/mutex/call_once/
> and compiled it. Results below.
>
> bash-4.4$ cat > call_once_2.cpp
> // call_once example
> #include <iostream>       // std::cout
> #include <thread>         // std::thread, std::this_thread::sleep_for
> #include <chrono>         // std::chrono::milliseconds
> #include <mutex>          // std::call_once, std::once_flag
>
> int winner;
> void set_winner (int x) { winner = x; }
> std::once_flag winner_flag;
>
> void wait_1000ms (int id) {
>   // count to 1000, waiting 1ms between increments:
>   for (int i=0; i<1000; ++i)
>     std::this_thread::sleep_for(std::chrono::milliseconds(1));
>   // claim to be the winner (only the first such call is executed):
>   std::call_once (winner_flag,set_winner,id);
> }
>
> int main ()
> {
>   std::thread threads[10];
>   // spawn 10 threads:
>   for (int i=0; i<10; ++i)
>     threads[i] = std::thread(wait_1000ms,i+1);
>
>   std::cout << "waiting for the first among 10 threads to count 1000 ms...\n";
>
>   for (auto& th : threads) th.join();
>   std::cout << "winner thread: " << winner << '\n';
>
>   return 0;
> }
> bash-4.4$ g++ -o call_once_2 -pthread call_once_2.cpp -lpthread
> bash-4.4$ ./call_once_2
> waiting for the first among 10 threads to count 1000 ms...
> winner thread: 2
> bash-4.4$ oslevel
> 6.1.0.0
> bash-4.4$ uname -a
> AIX bobaixgcc62 1 6 00FA21314C00
> bash-4.4$
>
> So, that compilation works for me. I am using AIX6.1 as opposed to
> your AIX 5.3. Please can you try compiling this small program on
> your system, so that we can establish whether it is an AIX version
> issue. Or maybe my compilation line will work for you?

Maybe worth mentioning... std::call_once is c++11. I don't recall what
GCC 4.8 uses by default, but -std=gnu11 or -std=c++11 may be useful.
Older GCC's, like 4.4 and 4.7, are likely using gnu++03 by default
(and may lack gnu++11 or c++11 support).

Jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]