1 /** 2 * Copyright 2023 Huawei Technologies Co., Ltd 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef MINDSPORE_CORE_MINDRT_RUNTIME_SEMAPHORE_H_ 18 #define MINDSPORE_CORE_MINDRT_RUNTIME_SEMAPHORE_H_ 19 20 #include <mutex> 21 #include <condition_variable> 22 23 namespace mindspore { 24 class Semaphore { 25 public: count_(count)26 explicit Semaphore(uint32_t count = 0) : count_(count) {} 27 Signal()28 inline void Signal() { 29 std::unique_lock<std::mutex> lock(mutex_); 30 ++count_; 31 lock.unlock(); 32 cv_.notify_one(); 33 } 34 Wait()35 inline void Wait() { 36 std::unique_lock<std::mutex> lock(mutex_); 37 cv_.wait(lock, [&] { return count_ > 0; }); 38 --count_; 39 } 40 41 private: 42 std::mutex mutex_; 43 std::condition_variable cv_; 44 uint32_t count_; 45 }; 46 } // namespace mindspore 47 48 #endif // MINDSPORE_CORE_MINDRT_RUNTIME_SEMAPHORE_H_ 49