forked from OSchip/llvm-project
Repair thread-unsafe modifications of n_alive in F.pass.cpp
In this example, the ctor of G runs in the main thread in the expression G(), and also in the copy ctor of G() in the DECAY_COPY inside std::thread. The main thread destroys the G() instance at the semicolon, and the started thread destroys the G() after it returns. Thus there is a race between the threads on the n_alive variable. The fix is to join with the background thread before attempting to destroy the G in the main thread. llvm-svn: 344820
This commit is contained in:
parent
8d947bad09
commit
e04704b9a9
|
@ -157,8 +157,11 @@ int main()
|
|||
{
|
||||
assert(G::n_alive == 0);
|
||||
assert(!G::op_run);
|
||||
std::thread t((G()));
|
||||
t.join();
|
||||
{
|
||||
G g;
|
||||
std::thread t(g);
|
||||
t.join();
|
||||
}
|
||||
assert(G::n_alive == 0);
|
||||
assert(G::op_run);
|
||||
}
|
||||
|
@ -185,8 +188,11 @@ int main()
|
|||
{
|
||||
assert(G::n_alive == 0);
|
||||
assert(!G::op_run);
|
||||
std::thread t(G(), 5, 5.5);
|
||||
t.join();
|
||||
{
|
||||
G g;
|
||||
std::thread t(g, 5, 5.5);
|
||||
t.join();
|
||||
}
|
||||
assert(G::n_alive == 0);
|
||||
assert(G::op_run);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue