Class that allows up to max_simultaneous_locks concurrent accesses to the critical section. It ignores task cancellation, unlike CancellableSemaphore.  
 More...
#include <userver/engine/semaphore.hpp>
 | 
|   | Semaphore (Counter capacity) | 
|   | 
| 
  | Semaphore (Semaphore &&)=delete | 
|   | 
| 
  | Semaphore (const Semaphore &)=delete | 
|   | 
| 
Semaphore &  | operator= (Semaphore &&)=delete | 
|   | 
| 
Semaphore &  | operator= (const Semaphore &)=delete | 
|   | 
| void  | SetCapacity (Counter capacity) | 
|   | 
| 
Counter  | GetCapacity () const noexcept | 
|   | Gets the total number of available locks. 
  | 
|   | 
| 
std::size_t  | RemainingApprox () const | 
|   | Returns an approximate number of available locks, use only for statistics. 
  | 
|   | 
| 
std::size_t  | UsedApprox () const | 
|   | Returns an approximate number of used locks, use only for statistics. 
  | 
|   | 
| void  | lock_shared () | 
|   | 
| void  | unlock_shared () | 
|   | 
| 
bool  | try_lock_shared () | 
|   | 
| template<typename Rep , typename Period >  | 
| bool  | try_lock_shared_for (std::chrono::duration< Rep, Period >) | 
|   | 
| template<typename Clock , typename Duration >  | 
| bool  | try_lock_shared_until (std::chrono::time_point< Clock, Duration >) | 
|   | 
| 
bool  | try_lock_shared_until (Deadline deadline) | 
|   | 
| 
void  | lock_shared_count (Counter count) | 
|   | 
| 
void  | unlock_shared_count (Counter count) | 
|   | 
| 
bool  | try_lock_shared_count (Counter count) | 
|   | 
| 
bool  | try_lock_shared_until_count (Deadline deadline, Counter count) | 
|   | 
Class that allows up to max_simultaneous_locks concurrent accesses to the critical section. It ignores task cancellation, unlike CancellableSemaphore. 
Example usage:
  constexpr auto kMaxSimultaneousLocks = 3;
  
  {
    std::shared_lock lock(sema);
    
    
  }
- See also
 - Synchronization Primitives 
 
Definition at line 136 of file semaphore.hpp.
 
◆ Counter
      
        
          | using engine::Semaphore::Counter =  std::size_t | 
        
      
 
 
◆ Semaphore()
  
  
      
        
          | engine::Semaphore::Semaphore  | 
          ( | 
          Counter  | 
          capacity | ) | 
           | 
         
       
   | 
  
explicit   | 
  
 
Creates a semaphore with predefined number of available locks 
- Parameters
 - 
  
    | capacity | initial number of available locks  | 
  
   
 
 
◆ lock_shared()
      
        
          | void engine::Semaphore::lock_shared  | 
          ( | 
           | ) | 
           | 
        
      
 
Decrements internal semaphore lock counter. Blocks if current counter is zero until the subsequent call to unlock_shared() by another coroutine. 
- Note
 - the user must eventually call unlock_shared() to increment the lock counter. 
 
- 
the method waits for the semaphore even if the current task is cancelled. 
 
- Exceptions
 - 
  
  
 
 
 
◆ SetCapacity()
      
        
          | void engine::Semaphore::SetCapacity  | 
          ( | 
          Counter  | 
          capacity | ) | 
           | 
        
      
 
Sets the total number of available locks. If the lock count decreases, the current acquired lock count may temporarily go above the limit. 
 
 
◆ try_lock_shared_for()
template<typename Rep , typename Period > 
      
        
          | bool engine::Semaphore::try_lock_shared_for  | 
          ( | 
          std::chrono::duration< Rep, Period >  | 
          duration | ) | 
           | 
        
      
 
 
◆ try_lock_shared_until()
template<typename Clock , typename Duration > 
      
        
          | bool engine::Semaphore::try_lock_shared_until  | 
          ( | 
          std::chrono::time_point< Clock, Duration >  | 
          until | ) | 
           | 
        
      
 
 
◆ unlock_shared()
      
        
          | void engine::Semaphore::unlock_shared  | 
          ( | 
           | ) | 
           | 
        
      
 
Increments internal semaphore lock counter. If there is a user waiting in lock_shared() on the same semaphore, it will be waken up. 
- Note
 - the order of coroutines to unblock is unspecified. Any code assuming any specific order (e.g. FIFO) is incorrect and must be fixed. 
 
- 
it is allowed to call lock_shared() in one coroutine and subsequently call unlock_shared() in another coroutine. In particular, it is allowed to pass std::shared_lock<engine::Semaphore> across coroutines. 
 
 
 
The documentation for this class was generated from the following file: