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