1*54fa9ecdSOlivier Giroux //===----------------------------------------------------------------------===//
2*54fa9ecdSOlivier Giroux //
3*54fa9ecdSOlivier Giroux // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*54fa9ecdSOlivier Giroux // See https://llvm.org/LICENSE.txt for license information.
5*54fa9ecdSOlivier Giroux // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*54fa9ecdSOlivier Giroux //
7*54fa9ecdSOlivier Giroux //===----------------------------------------------------------------------===//
8*54fa9ecdSOlivier Giroux //
9*54fa9ecdSOlivier Giroux // UNSUPPORTED: libcpp-has-no-threads
10*54fa9ecdSOlivier Giroux // UNSUPPORTED: c++98, c++03, c++11
11*54fa9ecdSOlivier Giroux 
12*54fa9ecdSOlivier Giroux // <semaphore>
13*54fa9ecdSOlivier Giroux 
14*54fa9ecdSOlivier Giroux #include <semaphore>
15*54fa9ecdSOlivier Giroux #include <chrono>
16*54fa9ecdSOlivier Giroux #include <thread>
17*54fa9ecdSOlivier Giroux 
18*54fa9ecdSOlivier Giroux #include "test_macros.h"
19*54fa9ecdSOlivier Giroux 
20*54fa9ecdSOlivier Giroux int main(int, char**)
21*54fa9ecdSOlivier Giroux {
22*54fa9ecdSOlivier Giroux   std::binary_semaphore s(1);
23*54fa9ecdSOlivier Giroux 
24*54fa9ecdSOlivier Giroux   auto l = [&](){
25*54fa9ecdSOlivier Giroux     for(int i = 0; i < 1024; ++i) {
26*54fa9ecdSOlivier Giroux         s.acquire();
27*54fa9ecdSOlivier Giroux         std::this_thread::sleep_for(std::chrono::microseconds(1));
28*54fa9ecdSOlivier Giroux         s.release();
29*54fa9ecdSOlivier Giroux     }
30*54fa9ecdSOlivier Giroux   };
31*54fa9ecdSOlivier Giroux 
32*54fa9ecdSOlivier Giroux   std::thread t(l);
33*54fa9ecdSOlivier Giroux   l();
34*54fa9ecdSOlivier Giroux 
35*54fa9ecdSOlivier Giroux   t.join();
36*54fa9ecdSOlivier Giroux 
37*54fa9ecdSOlivier Giroux   return 0;
38*54fa9ecdSOlivier Giroux }
39