Click here to Skip to main content
12,949,083 members (62,261 online)
Click here to Skip to main content


225 bookmarked
Posted 27 Sep 2004

Smart Pointers to boost your code

, 27 Sep 2004 CPOL
A beginner's introduction to the smart pointers provided by the boost library.

// MS compatible compilers support #pragma once

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once

//  boost/detail/lwm_win32.hpp
//  Copyright (c) 2002, 2003 Peter Dimov
//  Permission to copy, use, modify, sell and distribute this software
//  is granted provided this copyright notice appears in all copies.
//  This software is provided "as is" without express or implied
//  warranty, and with no claim as to its suitability for any purpose.

#  include <windows.h>

#ifdef __BORLANDC__
# pragma warn -8027     // Functions containing while are not expanded inline

namespace boost

namespace detail


#ifdef _WIN64

// Intel 6.0 on Win64 version, posted by Tim Fenders to [boost-users]

extern "C" long_type __cdecl _InterlockedExchange(long volatile *, long);

#pragma intrinsic(_InterlockedExchange)

inline long InterlockedExchange(long volatile* lp, long l)
    return _InterlockedExchange(lp, l);

#else  // _WIN64

extern "C" __declspec(dllimport) long __stdcall InterlockedExchange(long volatile *, long);

#endif // _WIN64

extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long);

#endif // #ifndef BOOST_USE_WINDOWS_H

class lightweight_mutex

    long l_;

    lightweight_mutex(lightweight_mutex const &);
    lightweight_mutex & operator=(lightweight_mutex const &);


    lightweight_mutex(): l_(0)

    class scoped_lock;
    friend class scoped_lock;

    class scoped_lock

        lightweight_mutex & m_;

        scoped_lock(scoped_lock const &);
        scoped_lock & operator=(scoped_lock const &);


        explicit scoped_lock(lightweight_mutex & m): m_(m)
            while( InterlockedExchange(&m_.l_, 1) )
                // Note: changed to Sleep(1) from Sleep(0).
                // According to MSDN, Sleep(0) will never yield
                // to a lower-priority thread, whereas Sleep(1)
                // will. Performance seems not to be affected.


            InterlockedExchange(&m_.l_, 0);

            // Note: adding a yield here will make
            // the spinlock more fair and will increase the overall
            // performance of some applications substantially in
            // high contention situations, but will penalize the
            // low contention / single thread case up to 5x

} // namespace detail

} // namespace boost

#ifdef __BORLANDC__
# pragma warn .8027     // Functions containing while are not expanded inline


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Germany Germany
Peter is tired of being called "Mr. Chen", even so certain individuals insist on it. No, he's not chinese.

Peter has seen lots of boxes you youngsters wouldn't even accept as calculators. He is proud of having visited the insides of a 16 Bit Machine.

In his spare time he ponders new ways of turning groceries into biohazards, or tries to coax South American officials to add some stamps to his passport.

Beyond these trivialities Peter works for Klippel[^], a small german company that wants to make mankind happier by selling them novel loudspeaker measurement equipment.

Where are you from?[^]

Please, if you are using one of my articles for anything, just leave me a comment. Seeing that this stuff is actually useful to someone is what keeps me posting and updating them.
Should you happen to not like it, tell me, too

You may also be interested in...

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170524.1 | Last Updated 27 Sep 2004
Article Copyright 2004 by peterchen
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid