]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 30_threads / condition_variable_any / 50862.cc
CommitLineData
d1236680 1// { dg-do run }
1e42d2f4 2// { dg-additional-options "-pthread" { target pthread } }
71c54f8e 3// { dg-require-effective-target c++11 }
5d020aa2 4// { dg-require-gthreads "" }
28c2f60e 5// { dg-require-sched-yield "" }
5d020aa2 6
a945c346 7// Copyright (C) 2011-2024 Free Software Foundation, Inc.
5d020aa2
JW
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.
14
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.
19
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/>.
23
24#include <condition_variable>
25#include <thread>
26#include <mutex>
27#include <array>
28#include <sstream>
29
30struct scoped_thread
31{
32 ~scoped_thread() { if (t.joinable()) t.join(); }
33 std::thread t;
34};
35
36int main()
37{
38 typedef std::unique_lock<std::mutex> Lock;
39
40 std::mutex m;
41 std::condition_variable_any cond;
e8a25ac8
PC
42 unsigned int product = 0;
43 const unsigned int count = 10;
5d020aa2
JW
44
45 // writing to stream causes timing changes which makes deadlock easier
46 // to reproduce - do not remove
47 std::ostringstream out;
48
49 // create consumers
50 std::array<scoped_thread, 2> threads;
e8a25ac8
PC
51 for (std::size_t i = 0; i < threads.size(); ++i)
52 threads[i].t
53 = std::thread( [&]
54 {
55 for (unsigned int i = 0; i < count; ++i)
56 {
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;
65 }
66 } );
5d020aa2
JW
67
68 // single producer
e8a25ac8
PC
69 for (std::size_t i = 0; i < threads.size() * count; ++i)
70 {
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();
77 }
5d020aa2 78}