brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 4fc436b Raw
104 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: no-threads10// ALLOW_RETRIES: 211 12// <condition_variable>13 14// class condition_variable_any;15 16// void notify_one();17 18#include <condition_variable>19#include <mutex>20#include <thread>21#include <cassert>22 23#include "make_test_thread.h"24#include "test_macros.h"25 26std::condition_variable_any cv;27 28typedef std::timed_mutex L0;29typedef std::unique_lock<L0> L1;30 31L0 m0;32 33int test0 = 0;34int test1 = 0;35int test2 = 0;36 37void f1()38{39    L1 lk(m0);40    assert(test1 == 0);41    while (test1 == 0)42        cv.wait(lk);43    assert(test1 == 1);44    test1 = 2;45}46 47void f2()48{49    L1 lk(m0);50    assert(test2 == 0);51    while (test2 == 0)52        cv.wait(lk);53    assert(test2 == 1);54    test2 = 2;55}56 57int main(int, char**)58{59    std::thread t1 = support::make_test_thread(f1);60    std::thread t2 = support::make_test_thread(f2);61    std::this_thread::sleep_for(std::chrono::milliseconds(100));62    {63        L1 lk(m0);64        test1 = 1;65        test2 = 1;66    }67    cv.notify_one();68    {69        std::this_thread::sleep_for(std::chrono::milliseconds(100));70        L1 lk(m0);71    }72    if (test1 == 2)73    {74        t1.join();75        test1 = 0;76    }77    else if (test2 == 2)78    {79        t2.join();80        test2 = 0;81    }82    else83        assert(false);84    cv.notify_one();85    {86        std::this_thread::sleep_for(std::chrono::milliseconds(100));87        L1 lk(m0);88    }89    if (test1 == 2)90    {91        t1.join();92        test1 = 0;93    }94    else if (test2 == 2)95    {96        t2.join();97        test2 = 0;98    }99    else100        assert(false);101 102  return 0;103}104