Fix race condition in thread test.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@237745 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier 2015-05-19 23:41:04 +00:00
parent 5d663441e7
commit 1a7ccb14e8

View File

@ -16,26 +16,41 @@
// void detach(); // void detach();
#include <thread> #include <thread>
#include <new> #include <atomic>
#include <cstdlib>
#include <cassert> #include <cassert>
std::atomic_bool done = ATOMIC_VAR_INIT(false);
class G class G
{ {
int alive_; int alive_;
bool done_;
public: public:
static int n_alive; static int n_alive;
static bool op_run; static bool op_run;
G() : alive_(1) {++n_alive;} G() : alive_(1), done_(false)
G(const G& g) : alive_(g.alive_) {++n_alive;} {
~G() {alive_ = 0; --n_alive;} ++n_alive;
}
G(const G& g) : alive_(g.alive_), done_(false)
{
++n_alive;
}
~G()
{
alive_ = 0;
--n_alive;
if (done_) done = true;
}
void operator()() void operator()()
{ {
assert(alive_ == 1); assert(alive_ == 1);
assert(n_alive >= 1); assert(n_alive >= 1);
op_run = true; op_run = true;
done_ = true;
} }
}; };
@ -45,12 +60,14 @@ bool G::op_run = false;
int main() int main()
{ {
{ {
std::thread t0((G())); G g;
std::thread t0(g);
assert(t0.joinable()); assert(t0.joinable());
t0.detach(); t0.detach();
assert(!t0.joinable()); assert(!t0.joinable());
std::this_thread::sleep_for(std::chrono::milliseconds(250)); while (!done) {}
assert(G::op_run); assert(G::op_run);
assert(G::n_alive == 1);
}
assert(G::n_alive == 0); assert(G::n_alive == 0);
} }
}