149 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ////////////////////////////////////////////////////////////
 | |
| //
 | |
| // SFML - Simple and Fast Multimedia Library
 | |
| // Copyright (C) 2007-2015 Laurent Gomila (laurent@sfml-dev.org)
 | |
| //
 | |
| // 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/System/Export.hpp>
 | |
| #include <SFML/System/NonCopyable.hpp>
 | |
| 
 | |
| 
 | |
| namespace sf
 | |
| {
 | |
| namespace priv
 | |
| {
 | |
|     class MutexImpl;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////////
 | |
| /// \brief Blocks concurrent access to shared resources
 | |
| ///        from multiple threads
 | |
| ///
 | |
| ////////////////////////////////////////////////////////////
 | |
| class SFML_SYSTEM_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* m_mutexImpl; ///< 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
 | |
| ///
 | |
| ////////////////////////////////////////////////////////////
 |