mirror of
https://github.com/SFML/SFML.git
synced 2024-11-29 06:41:05 +08:00
149 lines
5.0 KiB
C++
149 lines
5.0 KiB
C++
////////////////////////////////////////////////////////////
|
|
//
|
|
// SFML - Simple and Fast Multimedia Library
|
|
// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
|
|
//
|
|
// This software is provided 'as-is', without any express or implied warranty.
|
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it freely,
|
|
// subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented;
|
|
// you must not claim that you wrote the original software.
|
|
// If you use this software in a product, an acknowledgment
|
|
// in the product documentation would be appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such,
|
|
// and must not be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source distribution.
|
|
//
|
|
////////////////////////////////////////////////////////////
|
|
|
|
#ifndef SFML_MUTEX_HPP
|
|
#define SFML_MUTEX_HPP
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Headers
|
|
////////////////////////////////////////////////////////////
|
|
#include <SFML/Config.hpp>
|
|
#include <SFML/System/NonCopyable.hpp>
|
|
|
|
|
|
namespace sf
|
|
{
|
|
namespace priv
|
|
{
|
|
class MutexImpl;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Blocks concurrent access to shared resources
|
|
/// from multiple threads
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
class SFML_API Mutex : NonCopyable
|
|
{
|
|
public :
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Default constructor
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
Mutex();
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Destructor
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
~Mutex();
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Lock the mutex
|
|
///
|
|
/// If the mutex is already locked in another thread,
|
|
/// this call will block the execution until the mutex
|
|
/// is released.
|
|
///
|
|
/// \see Unlock
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
void Lock();
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Unlock the mutex
|
|
///
|
|
/// \see Lock
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
void Unlock();
|
|
|
|
private :
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Member data
|
|
////////////////////////////////////////////////////////////
|
|
priv::MutexImpl* myMutexImpl; ///< OS-specific implementation
|
|
};
|
|
|
|
} // namespace sf
|
|
|
|
|
|
#endif // SFML_MUTEX_HPP
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \class sf::Mutex
|
|
/// \ingroup system
|
|
///
|
|
/// Mutex stands for "MUTual EXclusion". A mutex is a
|
|
/// synchronization object, used when multiple threads are involved.
|
|
///
|
|
/// When you want to protect a part of the code from being accessed
|
|
/// simultaneously by multiple threads, you typically use a
|
|
/// mutex. When a thread is locked by a mutex, any other thread
|
|
/// trying to lock it will be blocked until the mutex is released
|
|
/// by the thread that locked it. This way, you can allow only
|
|
/// one thread at a time to access a critical region of your code.
|
|
///
|
|
/// Usage example:
|
|
/// \code
|
|
/// Database database; // this is a critical resource that needs some protection
|
|
/// sf::Mutex mutex;
|
|
///
|
|
/// void thread1()
|
|
/// {
|
|
/// mutex.Lock(); // this call will block the thread if the mutex is already locked by thread2
|
|
/// database.write(...);
|
|
/// mutex.Unlock(); // if thread2 was waiting, it will now be unblocked
|
|
/// }
|
|
///
|
|
/// void thread2()
|
|
/// {
|
|
/// mutex.Lock(); // this call will block the thread if the mutex is already locked by thread1
|
|
/// database.write(...);
|
|
/// mutex.Unlock(); // if thread1 was waiting, it will now be unblocked
|
|
/// }
|
|
/// \endcode
|
|
///
|
|
/// Be very careful with mutexes. A bad usage can lead to bad problems,
|
|
/// like deadlocks (two threads are waiting for each other and the
|
|
/// application is globally stuck).
|
|
///
|
|
/// To make the usage of mutexes more robust, particularly in
|
|
/// environments where exceptions can be thrown, you should
|
|
/// use the helper class sf::Lock to lock/unlock mutexes.
|
|
///
|
|
/// SFML mutexes are recursive, which means that you can lock
|
|
/// a mutex multiple times in the same thread without creating
|
|
/// a deadlock. In this case, the first call to Lock() behaves
|
|
/// as usual, and the following ones have no effect.
|
|
/// However, you must call Unlock() exactly as many times as you
|
|
/// called Lock(). If you don't, the mutex won't be released.
|
|
///
|
|
/// \see sf::Lock
|
|
///
|
|
////////////////////////////////////////////////////////////
|