Fix addvdi3 and subvdi3 patterns
[official-gcc.git] / libstdc++-v3 / testsuite / 30_threads / condition_variable_any / 50862.cc
blob87f6bc36fae95f461a386a85777ff03c9341fc27
1 // { dg-do run }
2 // { dg-additional-options "-pthread" { target pthread } }
3 // { dg-require-effective-target c++11 }
4 // { dg-require-gthreads "" }
5 // { dg-require-sched-yield "" }
7 // Copyright (C) 2011-2022 Free Software Foundation, Inc.
8 //
9 // This file is part of the GNU ISO C++ Library. This library is free
10 // software; you can redistribute it and/or modify it under the
11 // terms of the GNU General Public License as published by the
12 // Free Software Foundation; either version 3, or (at your option)
13 // any later version.
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
20 // You should have received a copy of the GNU General Public License along
21 // with this library; see the file COPYING3. If not see
22 // <http://www.gnu.org/licenses/>.
24 #include <condition_variable>
25 #include <thread>
26 #include <mutex>
27 #include <array>
28 #include <sstream>
30 struct scoped_thread
32 ~scoped_thread() { if (t.joinable()) t.join(); }
33 std::thread t;
36 int main()
38 typedef std::unique_lock<std::mutex> Lock;
40 std::mutex m;
41 std::condition_variable_any cond;
42 unsigned int product = 0;
43 const unsigned int count = 10;
45 // writing to stream causes timing changes which makes deadlock easier
46 // to reproduce - do not remove
47 std::ostringstream out;
49 // create consumers
50 std::array<scoped_thread, 2> threads;
51 for (std::size_t i = 0; i < threads.size(); ++i)
52 threads[i].t
53 = std::thread( [&]
55 for (unsigned int i = 0; i < count; ++i)
57 std::this_thread::yield();
58 Lock lock(m);
59 while(product == 0)
60 cond.wait(lock);
61 out << "got product "
62 << std::this_thread::get_id()
63 << ' ' << product << std::endl;
64 --product;
66 } );
68 // single producer
69 for (std::size_t i = 0; i < threads.size() * count; ++i)
71 std::this_thread::yield();
72 Lock lock(m);
73 ++product;
74 out << "setting product " << std::this_thread::get_id()
75 << ' ' << product << std::endl;
76 cond.notify_one();