Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is std::async broken in gcc 4.7 on linux? [closed]

I'm testing std::async in isolation before using it in real code, to verify that it works correctly on my platform (which is ubuntu 12.10 64-bit).

It works (somewhat rarely) and usually just hangs. If it works for you, don't jump to conclusions. Try a few more times, it will probably hang.

If I remove the pthread_mutex test, it doesn't hang. This is the smallest code I can get to reproduce the hang. Is there some reason that you can't mix C pthread code with c++ async code?

#include <iostream>
#include <pthread.h>
#include <chrono>
#include <future>
#include <iomanip>
#include <sstream>
#include <type_traits>

template<typename T>
std::string format_ns(T &&value)
{
    std::stringstream s;
    if (std::is_floating_point<T>::value)
        s << std::setprecision(3);

    if (value >= 1000000000)
        s << value / 1000000000 << "s";
    else if (value >= 1000000)
        s << value / 1000000 << "ms";
    else if (value >= 1000)
        s << value / 1000 << "us";
    else
        s << value  << "ns";
    return s.str();
}

template<typename F>
void test(const std::string &msg, int iter, F &&lambda)
{
    std::chrono::high_resolution_clock clock;
    auto st = clock.now();

    int i;
    for (i = 0; i < iter; ++i)
        lambda();
    auto en = clock.now();
    std::chrono::nanoseconds dur = std::chrono::duration_cast<
        std::chrono::nanoseconds>(en-st);

    std::cout << msg << format_ns(dur.count() / i) << std::endl;
}

int test_pthread_mutex()
{
    pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

    test("pthread_mutex_lock/pthread_mutex_unlock: ", 1000000000,
    [&]()
    {
        pthread_mutex_lock(&m);
        pthread_mutex_unlock(&m);
    });

    pthread_mutex_destroy(&m);

    return 0;
}

int test_async()
{
    test("async: ", 100,
    [&]()
    {
        auto asy = std::async(std::launch::async, [](){});
        asy.get();
    });

    return 0;
}

int main()
{
    test_pthread_mutex();
    test_async();
}

Here is the build command line:

g++ -Wextra -Wall  --std=c++11 -pthread mutexperf/main.cpp

There are no build output messages.

Here is the output of g++ -v

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-2ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)
like image 641
doug65536 Avatar asked Nov 04 '22 00:11

doug65536


1 Answers

I tried it on a few different computers and found that it indeed worked fine like @johan commented. I investigated the machine I was using and found evidence that the hard drive is beginning to fail. It has some bad sectors and also saw dmesg report several "hard resets" of the HDD after an unusual 4 second freeze. Odd, I hadn't seen any issues before I posted the question. It's probably some subtle/intermittent corruption when compiling/linking or perhaps when loading the executable.

[44242.380936] ata3.00: exception Emask 0x10 SAct 0x0 SErr 0x800000 action 0x6 frozen
[44242.380942] ata3.00: irq_stat 0x08000000, interface fatal error
[44242.380946] ata3: SError: { LinkSeq }
[44242.380950] sr 2:0:0:0: CDB: 
[44242.380952] Get event status notification: 4a 01 00 00 10 00 00 00 08 00
[44242.380965] ata3.00: cmd a0/00:00:00:08:00/00:00:00:00:00/a0 tag 0 pio 16392 in
[44242.380965]          res 50/00:03:00:08:00/00:00:00:00:00/a0 Emask 0x10 (ATA bus error)
[44242.380968] ata3.00: status: { DRDY }
[44242.380974] ata3: hard resetting link
[44242.700025] ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[44242.704849] ata3.00: configured for UDMA/100
[44242.720055] ata3: EH complete
[44970.117542] ata3.00: exception Emask 0x10 SAct 0x0 SErr 0x800100 action 0x6 frozen
[44970.117547] ata3.00: irq_stat 0x08000000, interface fatal error
[44970.117551] ata3: SError: { UnrecovData LinkSeq }
[44970.117555] sr 2:0:0:0: CDB: 
[44970.117557] Get event status notification: 4a 01 00 00 10 00 00 00 08 00
[44970.117570] ata3.00: cmd a0/00:00:00:08:00/00:00:00:00:00/a0 tag 0 pio 16392 in
[44970.117570]          res 50/00:03:00:08:00/00:00:00:00:00/a0 Emask 0x10 (ATA bus error)
[44970.117573] ata3.00: status: { DRDY }
[44970.117579] ata3: hard resetting link
[44970.436662] ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[44970.443159] ata3.00: configured for UDMA/100
[44970.456639] ata3: EH complete

Thanks to anyone who spent time looking at my issue!

like image 175
doug65536 Avatar answered Nov 15 '22 02:11

doug65536