lichao
2021-04-23 a04d4d01eb8e38b8ec5367114b5581bd64eee17e
mutex unlock check timeout to avoid double unlock.
3个文件已修改
25 ■■■■ 已修改文件
src/shm.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/shm.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
utest/api_test.cpp 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/shm.cpp
@@ -46,6 +46,16 @@
        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()),
src/shm.h
@@ -76,7 +76,7 @@
    ~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;
utest/api_test.cpp
@@ -151,7 +151,16 @@
        }
        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
@@ -210,7 +219,7 @@
        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();
            }