Browse Source

mutex_t完善无死锁批量加锁

tags/v2.9.7
tearshark 4 years ago
parent
commit
9f74f6c198
3 changed files with 9 additions and 15 deletions
  1. 4
    10
      librf/src/mutex_v2.h
  2. 3
    3
      librf/src/mutex_v2.inl
  3. 2
    2
      tutorial/test_async_mutex.cpp

+ 4
- 10
librf/src/mutex_v2.h View File

bool try_lock_until(const std::chrono::time_point<_Rep, _Period>& tp, void* unique_address); bool try_lock_until(const std::chrono::time_point<_Rep, _Period>& tp, void* unique_address);
void unlock(void* unique_address) const; void unlock(void* unique_address) const;




struct _MutexAwaitAssembleT; struct _MutexAwaitAssembleT;


template<class... _Mtxs template<class... _Mtxs
> >
static future_t<scoped_unlock_range_t> lock(_Mtxs&... mtxs); static future_t<scoped_unlock_range_t> lock(_Mtxs&... mtxs);



template<class... _Mtxs template<class... _Mtxs
, typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>>
> >
template<class... _Mtxs template<class... _Mtxs
, typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>>
> >
static void unlock(void* unique_address, _Mtxs&... mtxs)
{
unlock_address(unique_address, mtxs...);
}
static void unlock(void* unique_address, _Mtxs&... mtxs);


mutex_t(const mutex_t&) = default; mutex_t(const mutex_t&) = default;
mutex_t(mutex_t&&) = default; mutex_t(mutex_t&&) = default;
private: private:
friend struct scoped_lock_mutex_t; friend struct scoped_lock_mutex_t;
mutex_impl_ptr _mutex; mutex_impl_ptr _mutex;

template<class... _Mtxs
, typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>>
>
static void unlock_address(void* unique_address, mutex_t& _First, _Mtxs&... _Rest);
static void unlock_address(void*) {}
}; };
} }
} }

+ 3
- 3
librf/src/mutex_v2.inl View File

} }


template<class... _Mtxs, typename> template<class... _Mtxs, typename>
inline void mutex_t::unlock_address(void* unique_address, mutex_t& _First, _Mtxs&... _Rest)
inline void mutex_t::unlock(void* unique_address, _Mtxs&... mtxs)
{ {
_First.unlock(unique_address);
unlock_address(unique_address, _Rest...);
int _Ignored[] = { (mtxs.unlock(unique_address), 0)... };
(void)_Ignored;
} }
} }
} }

+ 2
- 2
tutorial/test_async_mutex.cpp View File

{ {
for (int i = 0; i < 10; ++i) for (int i = 0; i < 10; ++i)
{ {
auto __lockers = mutex_t::lock(a, b, c);
auto __lockers = co_await mutex_t::lock(a, b, c);
++g_counter; ++g_counter;
std::cout << "push:" << g_counter << " on " << idx << std::endl; std::cout << "push:" << g_counter << " on " << idx << std::endl;
{ {
for (int i = 0; i < 10; ++i) for (int i = 0; i < 10; ++i)
{ {
auto __lockers = mutex_t::lock(a, b, c);
auto __lockers = co_await mutex_t::lock(a, b, c);
--g_counter; --g_counter;
std::cout << "pop :" << g_counter << " on " << idx << std::endl; std::cout << "pop :" << g_counter << " on " << idx << std::endl;

Loading…
Cancel
Save