mutex unlock check timeout to avoid double unlock.
| | |
| | | std::this_thread::yield(); |
| | | } |
| | | } |
| | | void MutexWithTimeLimit::unlock() |
| | | { |
| | | auto old_time = last_lock_time_.load(); |
| | | if (Now() - old_time > limit_) { |
| | | } else { |
| | | if (last_lock_time_.compare_exchange_strong(old_time, Now())) { |
| | | mutex_.unlock(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | SharedMemory::SharedMemory(const std::string &name, const uint64_t size) : |
| | | mshm_t(open_or_create, name.c_str(), size, 0, AllowAll()), |
| | |
| | | ~MutexWithTimeLimit() { static_assert(std::is_pod<Duration>::value); } |
| | | bool try_lock(); |
| | | void lock(); |
| | | void unlock() { mutex_.unlock(); } |
| | | void unlock(); |
| | | }; |
| | | |
| | | // typedef boost::interprocess::interprocess_mutex Mutex; |
| | |
| | | } |
| | | st_.nlock_ += n; |
| | | } |
| | | void unlock() { mutex_.unlock(); } |
| | | void unlock() |
| | | { |
| | | auto old_time = last_lock_time_.load(); |
| | | if (Now() - old_time > limit_) { |
| | | } else { |
| | | if (last_lock_time_.compare_exchange_strong(old_time, Now())) { |
| | | mutex_.unlock(); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | namespace |
| | |
| | | TLMutex mutex; |
| | | // CasMutex mutex; |
| | | auto Lock = [&]() { |
| | | for (int i = 0; i < 1000 * 100; ++i) { |
| | | for (int i = 0; i < 1000 * 1000 * 10; ++i) { |
| | | mutex.lock(); |
| | | mutex.unlock(); |
| | | } |