Aufgabe 2: Unterbrechungen
By the use of Spinlocks, it is possible to serialize blocks of code that might run parallel on multiple CPU cores. More...
#include <sync/spinlock.h>
Public Member Functions | |
Spinlock () | |
Constructor; Initializes as unlocked. More... | |
void | lock () |
Enters the critical area. In case the area is already locked, lock() will actively wait for the area can be entered. More... | |
void | unlock () |
Unblocks the critical area. More... | |
Detailed Description
By the use of Spinlocks, it is possible to serialize blocks of code that might run parallel on multiple CPU cores.
Synchronization is implemented using a lock variable. Once a thread enters the critical area, it sets the lock variable (to a non-zero value); when this thread leaves the critical area, it resets the lock variable to zero. When trying to enter an already locked critical area, the trying thread actively waits until the critical area is free again.
Use the following two GCC intrinsics
bool __atomic_test_and_set(void *ptr, int memorder)
void __atomic_clear (bool *ptr, int memorder)
These intrinsics are translated into atomic, architecture-specific CPU instructions.
- Note
- 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.
Constructor & Destructor Documentation
|
inline |
Constructor; Initializes as unlocked.
- Todo:
- Complete Constructor (for OOStuBS, or use Ticketlock)
Member Function Documentation
|
inline |
Enters the critical area. In case the area is already locked, lock() will actively wait for the area can be entered.
- See also
- Core::pause()
- Todo:
- Implement Method (for OOStuBS, or use Ticketlock)
|
inline |
Unblocks the critical area.
- Todo:
- Implement Method (for OOStuBS, or use Ticketlock)
The documentation for this class was generated from the following file:
- sync/spinlock.h