[LLVMbugs] [Bug 14934] New: <future> std::async possible deadlock

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat Jan 12 11:35:20 PST 2013


http://llvm.org/bugs/show_bug.cgi?id=14934

             Bug #: 14934
           Summary: <future> std::async possible deadlock
           Product: libc++
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
        AssignedTo: hhinnant at apple.com
        ReportedBy: zhouyan1014 at gmail.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


I have found the problem on SVN version of Clang + Libc++ on Ubuntu 12.10,
and Clang + Libc++ on Mac OS X 10.8.2 with the latest Xcode.

Sometimes, when I spawn a work through async, the program halt forever. The
trouble is that the problem is difficult to reproduce and debug does not help
much. One of the reason I suspect there is some deadlock or similar issue is
that the problem seems to be very time sensitive.

However, I put together a program that may reproduce the problem,

// test.cpp
#include <cstdlib>
#include <future>
#include <iostream>
#include <thread>
#include <vector>

void do_nothing () {}

int main (int argc, const char **argv)
{
    if (argc < 3) {
        std::cerr
            << "Usage: test <number of trials> <number of threads>"
            << std::endl;
        return -1;
    }

    const int K = std::atoi(argv[1]);
    const int T = std::atoi(argv[2]);

    for (int k = 0; k != K; ++k) {
        std::cout << "Trial " << k << "...";
        std::cout.flush();
        std::vector<std::future<void> > tg;
        for (int t = 0; t != T; ++t)
            tg.push_back(std::async(do_nothing));
        for (int t = 0; t != T; ++t)
            tg[t].get();
        std::cout << "done" << std::endl;
    }

    return 0;
}



The program accept two numbers, one is the number of trials, and the other is
how may async will be used in each trial. For each trial, a group of
std::future is obtained by calling std::async, which was called with an empty
function that does nothing. And then we wait and get the results, which is also
nothing.

I compiled the program as,

clang++ -std=c++11 -stdlib=libc++ -g -O2 -o test test.cpp

(others configurations was tried, such as no debug info, or no optimization,
but I don't think that shall matter, since this is problem about correctness)

Normally, the program shall output 

./test 10 4
Trial 0...done
Trial 1...done
Trial 2...done
Trial 3...done
Trial 4...done
Trial 5...done
Trial 6...done
Trial 7...done
Trial 8...done
Trial 9...done

But if I increase the first number, say 10000, the screen start to scroll
rapidly (of course), but sooner or later, one of the trial halt there forever.

I am not quite sure exactly what bug is there. Or I oversight some very silly
problem in my own code. I tried the same program with MSVC 11 as well as GCC
4.7, no problem happened

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list