![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /proc/self/root/usr/include/boost/sort/common/ |
Upload File : |
//---------------------------------------------------------------------------- /// @file spinlock_t.hpp /// @brief /// /// @author Copyright (c) 2010 2015 Francisco José Tapia (fjtapia@gmail.com )\n /// Distributed under the Boost Software License, Version 1.0.\n /// ( See accompanyingfile LICENSE_1_0.txt or copy at /// http://www.boost.org/LICENSE_1_0.txt ) /// @version 0.1 /// /// @remarks //----------------------------------------------------------------------------- #ifndef __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP #define __BOOST_SORT_PARALLEL_DETAIL_UTIL_SPINLOCK_HPP #include <atomic> #include <ctime> #include <functional> #include <memory> #include <mutex> #include <thread> namespace boost { namespace sort { namespace common { // //--------------------------------------------------------------------------- /// @class spinlock_t /// @brief This class implement, from atomic variables, a spinlock /// @remarks This class meet the BasicLockable requirements ( lock, unlock ) //--------------------------------------------------------------------------- class spinlock_t { private: //------------------------------------------------------------------------ // P R I V A T E V A R I A B L E S //------------------------------------------------------------------------ std::atomic_flag af; public: // //------------------------------------------------------------------------- // function : spinlock_t /// @brief class constructor /// @param [in] //------------------------------------------------------------------------- explicit spinlock_t ( ) noexcept { af.clear ( ); }; // //------------------------------------------------------------------------- // function : lock /// @brief Lock the spinlock_t //------------------------------------------------------------------------- void lock ( ) noexcept { while (af.test_and_set (std::memory_order_acquire)) { std::this_thread::yield ( ); }; }; // //------------------------------------------------------------------------- // function : try_lock /// @brief Try to lock the spinlock_t, if not, return false /// @return true : locked /// false: not previous locked //------------------------------------------------------------------------- bool try_lock ( ) noexcept { return not af.test_and_set (std::memory_order_acquire); }; // //------------------------------------------------------------------------- // function : unlock /// @brief unlock the spinlock_t //------------------------------------------------------------------------- void unlock ( ) noexcept { af.clear (std::memory_order_release); }; }; // E N D C L A S S S P I N L O C K // //*************************************************************************** }; // end namespace common }; // end namespace sort }; // end namespace boost //*************************************************************************** #endif