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

@@ -52,6 +52,8 @@ RESUMEF_NS
bool try_lock_until(const std::chrono::time_point<_Rep, _Period>& tp, void* unique_address);
void unlock(void* unique_address) const;



struct _MutexAwaitAssembleT;

template<class... _Mtxs
@@ -59,6 +61,7 @@ RESUMEF_NS
>
static future_t<scoped_unlock_range_t> lock(_Mtxs&... mtxs);


template<class... _Mtxs
, typename = std::enable_if_t<std::conjunction_v<std::is_same<std::remove_cvref_t<_Mtxs>, mutex_t>...>>
>
@@ -67,10 +70,7 @@ RESUMEF_NS
template<class... _Mtxs
, 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(mutex_t&&) = default;
@@ -79,12 +79,6 @@ RESUMEF_NS
private:
friend struct scoped_lock_mutex_t;
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

@@ -546,10 +546,10 @@ RESUMEF_NS
}

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

@@ -145,7 +145,7 @@ static future_t<> resumable_mutex_range_push(size_t idx, mutex_t a, mutex_t b, m
{
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;
std::cout << "push:" << g_counter << " on " << idx << std::endl;
@@ -158,7 +158,7 @@ static future_t<> resumable_mutex_range_pop(size_t idx, mutex_t a, mutex_t b, mu
{
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;
std::cout << "pop :" << g_counter << " on " << idx << std::endl;

Loading…
Cancel
Save