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:
parent
5d663441e7
commit
1a7ccb14e8
@ -16,26 +16,41 @@
|
||||
// void detach();
|
||||
|
||||
#include <thread>
|
||||
#include <new>
|
||||
#include <cstdlib>
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
|
||||
std::atomic_bool done = ATOMIC_VAR_INIT(false);
|
||||
|
||||
class G
|
||||
{
|
||||
int alive_;
|
||||
bool done_;
|
||||
public:
|
||||
static int n_alive;
|
||||
static bool op_run;
|
||||
|
||||
G() : alive_(1) {++n_alive;}
|
||||
G(const G& g) : alive_(g.alive_) {++n_alive;}
|
||||
~G() {alive_ = 0; --n_alive;}
|
||||
G() : alive_(1), done_(false)
|
||||
{
|
||||
++n_alive;
|
||||
}
|
||||
|
||||
G(const G& g) : alive_(g.alive_), done_(false)
|
||||
{
|
||||
++n_alive;
|
||||
}
|
||||
~G()
|
||||
{
|
||||
alive_ = 0;
|
||||
--n_alive;
|
||||
if (done_) done = true;
|
||||
}
|
||||
|
||||
void operator()()
|
||||
{
|
||||
assert(alive_ == 1);
|
||||
assert(n_alive >= 1);
|
||||
op_run = true;
|
||||
done_ = true;
|
||||
}
|
||||
};
|
||||
|
||||
@ -45,12 +60,14 @@ bool G::op_run = false;
|
||||
int main()
|
||||
{
|
||||
{
|
||||
std::thread t0((G()));
|
||||
G g;
|
||||
std::thread t0(g);
|
||||
assert(t0.joinable());
|
||||
t0.detach();
|
||||
assert(!t0.joinable());
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(250));
|
||||
while (!done) {}
|
||||
assert(G::op_run);
|
||||
assert(G::n_alive == 0);
|
||||
assert(G::n_alive == 1);
|
||||
}
|
||||
assert(G::n_alive == 0);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user