You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
| /*! \file
 | |
|  *  \brief Contains the class Ticketlock
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| /*! \brief Using Ticketlocks, it is possible to serialize blocks of code
 | |
|  *  that might otherwise run in parallel on multiple CPU cores,
 | |
|  *  or be interleaved due to interrupts or scheduling.
 | |
|  *
 | |
|  *  \ingroup sync
 | |
|  *
 | |
|  *  Synchronization is implemented using a lock and a ticket variable.
 | |
|  *  Once a thread tries to enter the critical area, it obtains a ticket by
 | |
|  *  atomically incrementing the ticket variable and waiting until the lock
 | |
|  *  counter reaches this ticket, if it is not there already.
 | |
|  *  When a thread leaves the critical area, it increments the lock variable by
 | |
|  *  one and thereby allows the next thread to enter the critical area.
 | |
|  *
 | |
|  *  If you want that things just work, choose __ATOMIC_SEQ_CST as memorder.
 | |
|  *  This is not the most efficient memory order but works reasonably well.
 | |
|  *
 | |
|  *  <a
 | |
|  * href="https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html">Atomic
 | |
|  * Builtins in GCC manual</a>
 | |
|  */
 | |
| class Ticketlock {
 | |
|   // Prevent copies and assignments
 | |
|   Ticketlock(const Ticketlock& copy) = delete;
 | |
|   Ticketlock& operator=(const Ticketlock&) = delete;
 | |
| 
 | |
|  public:
 | |
|   /*! \brief Constructor
 | |
|    *
 | |
|    * \todo(12) Complete Constructor (for \MPStuBS)
 | |
|    */
 | |
|   consteval Ticketlock() {}
 | |
| 
 | |
|   /*! \brief Enters the critical area. In case the area is already locked,
 | |
|    *  \ref lock() will actively wait until the area can be entered.
 | |
|    *
 | |
|    * \see \ref Core::pause()
 | |
|    * \todo(12) Implement Method (for \MPStuBS)
 | |
|    */
 | |
|   void lock() {}
 | |
| 
 | |
|   /*! \brief Unblocks the critical area.
 | |
|    *
 | |
|    * \todo(12) Implement Method (for \MPStuBS)
 | |
|    */
 | |
|   void unlock() {}
 | |
| };
 |