Fawkes API
Fawkes Development Version
|
Mutex mutual exclusion lock. More...
#include <core/threading/mutex.h>
Public Member Functions | |
Mutex () | |
Constructor. | |
~Mutex () | |
Destructor. | |
void | lock () |
Lock this mutex. | |
bool | try_lock () |
Tries to lock the mutex. | |
void | unlock () |
Unlock the mutex. | |
void | stopby () |
Shortly stop by at the mutex. | |
Friends | |
class | WaitCondition |
Mutex mutual exclusion lock.
This class is used in a multi-threading environment to lock access to resources. This is needed to prevent two threads from modifying a value at the same time or to prevent a thread from getting a dirty copy of a piece of data (the reader reads while a writer is writing, this could leave the data in a state where the reader reads half of the new and half of the old data).
As a rule of thumb you should lock the mutex as short as possible and as long as needed. Locking the mutex too long will lead in a bad performance of the multi-threaded application because many threads are waiting for the lock and are not doing anything useful. If you do not lock enough code (and so serialize it) it will cause pain and errors.
void fawkes::Mutex::lock | ( | ) |
Lock this mutex.
A call to lock() will block until the lock on the mutex could be aquired. If you want to avoid see consider using try_lock().
Definition at line 78 of file mutex.cpp.
References fawkes::Thread::current_thread().
Referenced by JoystickAcquisitionThread::loop(), JoystickAcquisitionThread::lock_if_new_data(), LaserAcquisitionThread::lock_if_new_data(), firevision::FuseClient::disconnect(), firevision::FuseClient::enqueue_and_wait(), firevision::FuseClient::loop(), firevision::FuseClient::wait(), firevision::FuseClient::wait_greeting(), fawkes::BlackBoardInterfaceManager::open_for_reading(), fawkes::BlackBoardInterfaceManager::open_multiple_for_reading(), fawkes::BlackBoardInterfaceManager::open_for_writing(), fawkes::BlackBoardInterfaceManager::close(), fawkes::BlackBoardNotifier::register_listener(), fawkes::BlackBoardNotifier::register_observer(), fawkes::BlackBoardNotifier::notify_of_data_change(), fawkes::BlackBoardNotifier::notify_of_message_received(), fawkes::RemoteBlackBoard::list_all(), fawkes::NetworkConfiguration::tag(), fawkes::NetworkConfiguration::tags(), fawkes::NetworkConfiguration::get_type(), fawkes::NetworkConfiguration::get_float(), fawkes::NetworkConfiguration::get_uint(), fawkes::NetworkConfiguration::get_int(), fawkes::NetworkConfiguration::get_bool(), fawkes::NetworkConfiguration::get_string(), fawkes::NetworkConfiguration::get_comment(), fawkes::NetworkConfiguration::get_default_comment(), fawkes::NetworkConfiguration::get_value(), fawkes::NetworkConfiguration::set_mirror_mode(), fawkes::NetworkConfiguration::lock(), fawkes::SQLiteConfiguration::load(), fawkes::SQLiteConfiguration::tag(), fawkes::SQLiteConfiguration::tags(), fawkes::SQLiteConfiguration::exists(), fawkes::SQLiteConfiguration::get_type(), fawkes::SQLiteConfiguration::get_comment(), fawkes::SQLiteConfiguration::get_default_comment(), fawkes::SQLiteConfiguration::is_default(), fawkes::SQLiteConfiguration::get_float(), fawkes::SQLiteConfiguration::get_uint(), fawkes::SQLiteConfiguration::get_int(), fawkes::SQLiteConfiguration::get_bool(), fawkes::SQLiteConfiguration::get_string(), fawkes::SQLiteConfiguration::set_float(), fawkes::SQLiteConfiguration::set_uint(), fawkes::SQLiteConfiguration::set_int(), fawkes::SQLiteConfiguration::set_bool(), fawkes::SQLiteConfiguration::set_string(), fawkes::SQLiteConfiguration::set_comment(), fawkes::SQLiteConfiguration::set_default_float(), fawkes::SQLiteConfiguration::set_default_uint(), fawkes::SQLiteConfiguration::set_default_int(), fawkes::SQLiteConfiguration::set_default_bool(), fawkes::SQLiteConfiguration::set_default_string(), fawkes::SQLiteConfiguration::set_default_comment(), fawkes::SQLiteConfiguration::lock(), fawkes::Exception::prepend(), fawkes::Exception::append(), fawkes::Exception::print_trace(), fawkes::MutexLocker::MutexLocker(), fawkes::MutexLocker::relock(), fawkes::Thread::prepare_finalize(), fawkes::Thread::cancel_finalize(), fawkes::Thread::set_prepfin_hold(), fawkes::Thread::run(), fawkes::ThreadList::prepare_finalize(), fawkes::ThreadList::cancel_finalize(), fawkes::WaitCondition::wait(), fawkes::WaitCondition::abstimed_wait(), fawkes::WaitCondition::reltimed_wait(), fawkes::WaitCondition::wake_one(), fawkes::WaitCondition::wake_all(), fawkes::RefCount::ref(), fawkes::RefCount::unref(), fawkes::RefPtr::RefPtr(), fawkes::MessageQueue::flush(), fawkes::MessageQueue::append(), fawkes::MessageQueue::remove(), fawkes::MessageQueue::size(), fawkes::MessageQueue::empty(), fawkes::MessageQueue::lock(), fawkes::MessageQueue::pop(), fawkes::FawkesNetworkClientSendThread::loop(), fawkes::FawkesNetworkClientSendThread::enqueue(), fawkes::FawkesNetworkClient::connect(), fawkes::FawkesNetworkClient::interrupt_connect(), fawkes::FawkesNetworkClient::enqueue_and_wait(), fawkes::FawkesNetworkClient::deregister_handler(), fawkes::FawkesNetworkClient::wait(), fawkes::FawkesNetworkClient::wake(), fawkes::FawkesNetworkServerClientSendThread::loop(), fawkes::FawkesNetworkServerClientSendThread::enqueue(), fawkes::FawkesNetworkServerClientSendThread::wait_for_all_sent(), fawkes::NetworkNameResolverThread::~NetworkNameResolverThread(), fawkes::NetworkNameResolverThread::resolve_name(), fawkes::NetworkNameResolverThread::loop(), fawkes::CacheLogger::clear(), fawkes::CacheLogger::lock(), fawkes::ConsoleLogger::vlog_debug(), fawkes::ConsoleLogger::vlog_info(), fawkes::ConsoleLogger::vlog_warn(), fawkes::ConsoleLogger::vlog_error(), fawkes::ConsoleLogger::log_debug(), fawkes::ConsoleLogger::log_info(), fawkes::ConsoleLogger::log_warn(), fawkes::ConsoleLogger::log_error(), fawkes::ConsoleLogger::tlog_debug(), fawkes::ConsoleLogger::tlog_info(), fawkes::ConsoleLogger::tlog_warn(), fawkes::ConsoleLogger::tlog_error(), fawkes::ConsoleLogger::vtlog_debug(), fawkes::ConsoleLogger::vtlog_info(), fawkes::ConsoleLogger::vtlog_warn(), fawkes::ConsoleLogger::vtlog_error(), fawkes::FileLogger::log_debug(), fawkes::FileLogger::log_info(), fawkes::FileLogger::log_warn(), fawkes::FileLogger::log_error(), fawkes::FileLogger::vlog_debug(), fawkes::FileLogger::vlog_info(), fawkes::FileLogger::vlog_warn(), fawkes::FileLogger::vlog_error(), fawkes::FileLogger::tlog_debug(), fawkes::FileLogger::tlog_info(), fawkes::FileLogger::tlog_warn(), fawkes::FileLogger::tlog_error(), fawkes::FileLogger::vtlog_debug(), fawkes::FileLogger::vtlog_info(), fawkes::FileLogger::vtlog_warn(), fawkes::FileLogger::vtlog_error(), fawkes::LibLogger::add_logger(), fawkes::LibLogger::remove_logger(), fawkes::LibLogger::log_debug(), fawkes::LibLogger::log_info(), fawkes::LibLogger::log_warn(), fawkes::LibLogger::log_error(), fawkes::LibLogger::vlog_debug(), fawkes::LibLogger::vlog_info(), fawkes::LibLogger::vlog_warn(), fawkes::LibLogger::vlog_error(), fawkes::ModuleManagerTemplate::open_module(), fawkes::ModuleManagerTemplate::close_module(), FawkesMainThread::set_mainloop_thread(), FawkesMainThread::loop(), BBLoggerThread::loop(), KatanaSensorAcquisitionThread::set_enabled(), HokuyoUrgAcquisitionThread::loop(), and HokuyoUrgGbxAcquisitionThread::loop().
void fawkes::Mutex::stopby | ( | ) |
Shortly stop by at the mutex.
This will just lock and unlock the mutex. It is equivalent to
mutex->lock(); mutex->unlock();
This can be handy if you have to protect starvation and just have a stop-by mutex.
Definition at line 144 of file mutex.cpp.
Referenced by fawkes::Thread::run().
bool fawkes::Mutex::try_lock | ( | ) |
Tries to lock the mutex.
This can also be used to check if a mutex is locked. The code for this can be:
bool locked = false; if ( mutex->try_lock() ) { mutex->unlock(); locked = true; }
This cannot be implemented in Mutex in a locked() method since this would lead to race conditions in many situations.
Definition at line 109 of file mutex.cpp.
Referenced by fawkes::NetworkConfiguration::try_lock(), fawkes::SQLiteConfiguration::try_lock(), fawkes::Thread::join(), fawkes::Thread::running(), fawkes::MessageQueue::insert_after(), fawkes::MessageQueue::try_lock(), fawkes::MessageQueue::begin(), fawkes::MessageQueue::end(), and fawkes::FawkesNetworkClientSendThread::force_send().
void fawkes::Mutex::unlock | ( | ) |
Unlock the mutex.
Definition at line 124 of file mutex.cpp.
Referenced by JoystickAcquisitionThread::loop(), JoystickAcquisitionThread::lock_if_new_data(), JoystickAcquisitionThread::unlock(), LaserAcquisitionThread::lock_if_new_data(), LaserAcquisitionThread::unlock(), firevision::FuseClient::disconnect(), firevision::FuseClient::enqueue_and_wait(), firevision::FuseClient::loop(), firevision::FuseClient::wait(), firevision::FuseClient::wait_greeting(), fawkes::BlackBoardInterfaceManager::open_for_reading(), fawkes::BlackBoardInterfaceManager::open_multiple_for_reading(), fawkes::BlackBoardInterfaceManager::open_for_writing(), fawkes::BlackBoardInterfaceManager::close(), fawkes::BlackBoardNotifier::register_listener(), fawkes::BlackBoardNotifier::register_observer(), fawkes::BlackBoardNotifier::notify_of_data_change(), fawkes::BlackBoardNotifier::notify_of_message_received(), fawkes::RemoteBlackBoard::list_all(), fawkes::NetworkConfiguration::tag(), fawkes::NetworkConfiguration::tags(), fawkes::NetworkConfiguration::get_type(), fawkes::NetworkConfiguration::get_float(), fawkes::NetworkConfiguration::get_uint(), fawkes::NetworkConfiguration::get_int(), fawkes::NetworkConfiguration::get_bool(), fawkes::NetworkConfiguration::get_string(), fawkes::NetworkConfiguration::get_comment(), fawkes::NetworkConfiguration::get_default_comment(), fawkes::NetworkConfiguration::get_value(), fawkes::NetworkConfiguration::set_mirror_mode(), fawkes::NetworkConfiguration::unlock(), fawkes::SQLiteConfiguration::load(), fawkes::SQLiteConfiguration::tag(), fawkes::SQLiteConfiguration::tags(), fawkes::SQLiteConfiguration::exists(), fawkes::SQLiteConfiguration::get_type(), fawkes::SQLiteConfiguration::get_comment(), fawkes::SQLiteConfiguration::get_default_comment(), fawkes::SQLiteConfiguration::is_default(), fawkes::SQLiteConfiguration::get_float(), fawkes::SQLiteConfiguration::get_uint(), fawkes::SQLiteConfiguration::get_int(), fawkes::SQLiteConfiguration::get_bool(), fawkes::SQLiteConfiguration::get_string(), fawkes::SQLiteConfiguration::set_float(), fawkes::SQLiteConfiguration::set_uint(), fawkes::SQLiteConfiguration::set_int(), fawkes::SQLiteConfiguration::set_bool(), fawkes::SQLiteConfiguration::set_string(), fawkes::SQLiteConfiguration::set_comment(), fawkes::SQLiteConfiguration::set_default_float(), fawkes::SQLiteConfiguration::set_default_uint(), fawkes::SQLiteConfiguration::set_default_int(), fawkes::SQLiteConfiguration::set_default_bool(), fawkes::SQLiteConfiguration::set_default_string(), fawkes::SQLiteConfiguration::set_default_comment(), fawkes::SQLiteConfiguration::unlock(), fawkes::Exception::prepend(), fawkes::Exception::append(), fawkes::Exception::print_trace(), fawkes::MutexLocker::~MutexLocker(), fawkes::MutexLocker::unlock(), fawkes::Thread::prepare_finalize(), fawkes::Thread::cancel_finalize(), fawkes::Thread::join(), fawkes::Thread::set_prepfin_hold(), fawkes::Thread::running(), fawkes::Thread::run(), fawkes::ThreadList::prepare_finalize(), fawkes::ThreadList::cancel_finalize(), fawkes::WaitCondition::wait(), fawkes::WaitCondition::abstimed_wait(), fawkes::WaitCondition::reltimed_wait(), fawkes::WaitCondition::wake_one(), fawkes::WaitCondition::wake_all(), fawkes::RefCount::ref(), fawkes::RefCount::unref(), fawkes::RefPtr::RefPtr(), fawkes::MessageQueue::flush(), fawkes::MessageQueue::append(), fawkes::MessageQueue::insert_after(), fawkes::MessageQueue::remove(), fawkes::MessageQueue::size(), fawkes::MessageQueue::empty(), fawkes::MessageQueue::unlock(), fawkes::MessageQueue::pop(), fawkes::MessageQueue::begin(), fawkes::MessageQueue::end(), fawkes::FawkesNetworkClientSendThread::loop(), fawkes::FawkesNetworkClientSendThread::force_send(), fawkes::FawkesNetworkClientSendThread::enqueue(), fawkes::FawkesNetworkClient::connect(), fawkes::FawkesNetworkClient::interrupt_connect(), fawkes::FawkesNetworkClient::enqueue_and_wait(), fawkes::FawkesNetworkClient::deregister_handler(), fawkes::FawkesNetworkClient::wait(), fawkes::FawkesNetworkClient::wake(), fawkes::FawkesNetworkServerClientSendThread::loop(), fawkes::FawkesNetworkServerClientSendThread::enqueue(), fawkes::FawkesNetworkServerClientSendThread::wait_for_all_sent(), fawkes::NetworkNameResolverThread::~NetworkNameResolverThread(), fawkes::NetworkNameResolverThread::resolve_name(), fawkes::NetworkNameResolverThread::resolve_address(), fawkes::NetworkNameResolverThread::loop(), fawkes::CacheLogger::clear(), fawkes::CacheLogger::unlock(), fawkes::ConsoleLogger::vlog_debug(), fawkes::ConsoleLogger::vlog_info(), fawkes::ConsoleLogger::vlog_warn(), fawkes::ConsoleLogger::vlog_error(), fawkes::ConsoleLogger::log_debug(), fawkes::ConsoleLogger::log_info(), fawkes::ConsoleLogger::log_warn(), fawkes::ConsoleLogger::log_error(), fawkes::ConsoleLogger::tlog_debug(), fawkes::ConsoleLogger::tlog_info(), fawkes::ConsoleLogger::tlog_warn(), fawkes::ConsoleLogger::tlog_error(), fawkes::ConsoleLogger::vtlog_debug(), fawkes::ConsoleLogger::vtlog_info(), fawkes::ConsoleLogger::vtlog_warn(), fawkes::ConsoleLogger::vtlog_error(), fawkes::FileLogger::log_debug(), fawkes::FileLogger::log_info(), fawkes::FileLogger::log_warn(), fawkes::FileLogger::log_error(), fawkes::FileLogger::vlog_debug(), fawkes::FileLogger::vlog_info(), fawkes::FileLogger::vlog_warn(), fawkes::FileLogger::vlog_error(), fawkes::FileLogger::tlog_debug(), fawkes::FileLogger::tlog_info(), fawkes::FileLogger::tlog_warn(), fawkes::FileLogger::tlog_error(), fawkes::FileLogger::vtlog_debug(), fawkes::FileLogger::vtlog_info(), fawkes::FileLogger::vtlog_warn(), fawkes::FileLogger::vtlog_error(), fawkes::LibLogger::add_logger(), fawkes::LibLogger::remove_logger(), fawkes::LibLogger::log_debug(), fawkes::LibLogger::log_info(), fawkes::LibLogger::log_warn(), fawkes::LibLogger::log_error(), fawkes::LibLogger::vlog_debug(), fawkes::LibLogger::vlog_info(), fawkes::LibLogger::vlog_warn(), fawkes::LibLogger::vlog_error(), fawkes::ModuleManagerTemplate::open_module(), fawkes::ModuleManagerTemplate::close_module(), FawkesMainThread::set_mainloop_thread(), FawkesMainThread::loop(), BBLoggerThread::loop(), KatanaSensorAcquisitionThread::set_enabled(), HokuyoUrgAcquisitionThread::loop(), and HokuyoUrgGbxAcquisitionThread::loop().