Click here to Skip to main content
11,575,109 members (55,412 online)
Click here to Skip to main content

Spin Lock

, 16 Jun 2002 138.1K 683 12
Rate this:
Please Sign up or sign in to vote.
Efficient synchronised access to shared resources
<!-- (C) 2001 Craig Henderson mailto:cdm.henderson@virgin.net http://homepage.virgin.net/cdm.henderson -->

Introduction

Spin locks are a very simple and, in the right context, efficient method of synchronising access to shared resources. The overhead of using Critical Sections or Events for resource acquision is relatively large, but in contrast, a spin lock is very quick.

Algorithm

Predictably, the algorithm for a spin lock is very simple. Each thread will instantiate a CSpinLock with a shared lock variable. When a shared resource is required, the threads call lock() and when the resource has been finished with, call unlock().

lock() will cause the thread to loop until the resource is available. The availability of the resource is defined by the value of shared variable. If the value of this variable is zero, then the resource is available, otherwise it is in use by another thread. When the resource is locked, the shared variable holds the value 0x6b636f6c. This will read "lock" if it is cast to a char *

Implementation

The CSpinLock class implements a spin lock synchronisation object.

Methods

explicit CSpinLock(long *plock = 0)
This is the only class constructor. It passes a pointer to a shared variable to hold the lock value. This parameter can be omitted, in which case an internal class lock variable will be used.

~CSpinLock()
Class destructor. Simply asserts that the object that is going out of scope does not hold the lock.

void lock(void) const
Call this method to acquire a lock to the shared resource.

void unlock(void) const
Call this method to release the lock to the shared resource.

bool has_lock(void) const
Returns true/false to signify if the object currently holds the lock

Usage

The only decision to be made in using this class is in how the lock variable is used. The easiest use is to omit the ctor parameter and let the class handle this itself. Each resource that is to be shared can be synchronised using a different template parameter value. Each thread can independently instantiate a CSpinLock object and the class implementation will ensure that the resource is synchronised correctly.

Contact

Web Site: http://homepage.virgin.net/cdm.henderson
e-mail: cdm.henderson@virgin.net

Revision History

17 Jun 2002 - Initial Revision

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Craig Henderson
Technical Lead
United Kingdom United Kingdom
Craig graduated with a B.SC. Honours in Computing for Real Time Systems from the University of the West of England, Bristol in 1995 after completing an HND in Computing in 1993.

You may also be interested in...

Comments and Discussions

 
GeneralUse Sleep( 0 ) Pin
ajohnson12320-Mar-04 14:20
memberajohnson12320-Mar-04 14:20 
GeneralRe: Use Sleep( 0 ) Pin
bkausbk11-Apr-04 8:48
memberbkausbk11-Apr-04 8:48 
QuestionDid you test the code before posting? Pin
Anonymous17-Jun-02 18:20
memberAnonymous17-Jun-02 18:20 
AnswerRe: Did you test the code before posting? Pin
Anonymous17-Jun-02 18:25
memberAnonymous17-Jun-02 18:25 
Oops, you did say the following so forget about the first problem I mentioned:

The availability of the resource is defined by the value of shared variable. If the value of this variable is zero, then the resource is available, otherwise it is in use by another thread.
AnswerRe: Did you test the code before posting? Pin
Craig Henderson21-Jun-02 0:54
memberCraig Henderson21-Jun-02 0:54 
GeneralBug in has_lock() Pin
Eric Kenslow17-Jun-02 11:25
memberEric Kenslow17-Jun-02 11:25 
GeneralRe: Bug in has_lock() Pin
Craig Henderson21-Jun-02 0:56
memberCraig Henderson21-Jun-02 0:56 
GeneralA small almost irrelevant point Pin
Nish - Native CPian23-May-02 1:40
memberNish - Native CPian23-May-02 1:40 
GeneralRe: A small almost irrelevant point Pin
Craig Henderson23-May-02 2:44
memberCraig Henderson23-May-02 2:44 
GeneralRe: A small almost irrelevant point Pin
Joao Vaz23-May-02 11:19
memberJoao Vaz23-May-02 11:19 
GeneralRe: A small almost irrelevant point Pin
Nish - Native CPian23-May-02 15:39
memberNish - Native CPian23-May-02 15:39 
GeneralAnother alternative for Spin Lock Pin
Maxime Labelle23-May-02 1:28
memberMaxime Labelle23-May-02 1:28 
GeneralNot a bad attempt but ... Pin
Joao Vaz23-May-02 0:52
memberJoao Vaz23-May-02 0:52 
GeneralRe: Not a bad attempt but ... Pin
Wes Jones23-May-02 8:06
memberWes Jones23-May-02 8:06 
GeneralRe: Not a bad attempt but ... Pin
Matt Gullett23-May-02 8:31
memberMatt Gullett23-May-02 8:31 
GeneralRe: Not a bad attempt but ... Pin
Joao Vaz23-May-02 11:09
memberJoao Vaz23-May-02 11:09 
GeneralCritical sections etc. + Metered Sections Pin
Neville Franks23-May-02 12:38
memberNeville Franks23-May-02 12:38 
GeneralRe: Critical sections etc. + Metered Sections Pin
Matt Gullett23-May-02 12:43
memberMatt Gullett23-May-02 12:43 
GeneralRe: Critical sections etc. + Metered Sections Pin
Neville Franks23-May-02 12:53
memberNeville Franks23-May-02 12:53 
GeneralRe: Critical sections etc. + Metered Sections Pin
Matt Gullett23-May-02 13:04
memberMatt Gullett23-May-02 13:04 
GeneralRe: Critical sections etc. + Metered Sections Pin
Joao Vaz23-May-02 19:57
memberJoao Vaz23-May-02 19:57 
GeneralRe: Not a bad attempt but ... Pin
Tim Smith23-May-02 8:26
memberTim Smith23-May-02 8:26 
GeneralRe: Not a bad attempt but ... Pin
Joao Vaz23-May-02 10:44
memberJoao Vaz23-May-02 10:44 
GeneralRe: Not a bad attempt but ... Pin
Joao Vaz23-May-02 11:29
memberJoao Vaz23-May-02 11:29 
GeneralRe: Not a bad attempt but ... Pin
Tim Smith23-May-02 12:59
memberTim Smith23-May-02 12:59 
GeneralLoadLibrary Pin
Wout Louwers22-May-02 20:55
memberWout Louwers22-May-02 20:55 
GeneralRe: LoadLibrary Pin
Wes Jones23-May-02 8:09
memberWes Jones23-May-02 8:09 
GeneralRe: LoadLibrary Pin
Tim Smith23-May-02 8:27
memberTim Smith23-May-02 8:27 
GeneralA good MSDN article Pin
Dudi Avramov22-May-02 20:33
memberDudi Avramov22-May-02 20:33 
GeneralRe: A good MSDN article Pin
Craig Henderson22-May-02 22:13
memberCraig Henderson22-May-02 22:13 
GeneralRe: A good MSDN article Pin
Dudi Avramov22-May-02 22:22
memberDudi Avramov22-May-02 22:22 
GeneralRe: A good MSDN article Pin
Wes Jones23-May-02 8:55
memberWes Jones23-May-02 8:55 
GeneralRe: A good MSDN article Pin
Dudi Avramov26-May-02 0:17
memberDudi Avramov26-May-02 0:17 
GeneralRe: A good MSDN article Pin
Neville Franks23-May-02 12:21
memberNeville Franks23-May-02 12:21 
GeneralAnother alternative for SwitchToThread Pin
Dudi Avramov22-May-02 20:26
memberDudi Avramov22-May-02 20:26 
GeneralRe: Another alternative for SwitchToThread Pin
Anonymous23-May-02 8:04
memberAnonymous23-May-02 8:04 
GeneralRe: Another alternative for SwitchToThread Pin
Joao Vaz23-May-02 11:22
memberJoao Vaz23-May-02 11:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150624.2 | Last Updated 17 Jun 2002
Article Copyright 2002 by Craig Henderson
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid