本文整理汇总了C++中std::unique_lock::owns_lock方法的典型用法代码示例。如果您正苦于以下问题:C++ unique_lock::owns_lock方法的具体用法?C++ unique_lock::owns_lock怎么用?C++ unique_lock::owns_lock使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类std::unique_lock
的用法示例。
在下文中一共展示了unique_lock::owns_lock方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: advance_state
void SyncSession::advance_state(std::unique_lock<std::mutex>& lock, const State& state)
{
REALM_ASSERT(lock.owns_lock());
REALM_ASSERT(&state != m_state);
m_state = &state;
m_state->enter_state(lock, *this);
}
示例2: run
bool io_service_thread_pool::run(std::unique_lock<compat::mutex>& l,
std::size_t num_threads)
{
HPX_ASSERT(l.owns_lock());
compat::barrier startup(1);
return threads_.run(num_threads, false, &startup);
}
示例3: unregister
void SyncSession::unregister(std::unique_lock<std::mutex>& lock)
{
REALM_ASSERT(lock.owns_lock());
REALM_ASSERT(m_state == &State::inactive); // Must stop an active session before unregistering.
lock.unlock();
SyncManager::shared().unregister_session(m_realm_path);
}
示例4: proceed
void Solver::proceed(std::unique_lock<std::mutex>& lock)
{
assert(lock.mutex() == &workerMutex && lock.owns_lock());
wakeMainThreadRequested = true;
wakeMainThread.notify_one();
wakeWorkerThread.wait(lock, [&]() { return wakeWorkerThreadRequested; });
wakeWorkerThreadRequested = false;
}
示例5: check_buffer_level
// checks to see if we're no longer exceeding the high watermark,
// and if we're in fact below the low watermark. If so, we need to
// post the notification messages to the peers that are waiting for
// more buffers to received data into
void disk_buffer_pool::check_buffer_level(std::unique_lock<std::mutex>& l)
{
TORRENT_ASSERT(l.owns_lock());
if (!m_exceeded_max_size || m_in_use > m_low_watermark) return;
m_exceeded_max_size = false;
std::vector<std::weak_ptr<disk_observer>> cbs;
m_observers.swap(cbs);
l.unlock();
m_ios.post(std::bind(&watermark_callback, std::move(cbs)));
}
示例6: clearJobs
void DinicVertexLayerP::clearJobs(std::unique_lock<std::mutex>& lock, bool check)
{
if (!lock.owns_lock())
{
lock.lock();
}
jobs.clear();
jobs.swap(queueJobs);
runJobs = vector<bool>(jobs.size(), false);
assert(queueJobs.empty());
if (check) assert(jobs.empty());
}
示例7: free_buffer_impl
void disk_buffer_pool::free_buffer_impl(char* buf, std::unique_lock<std::mutex>& l)
{
TORRENT_ASSERT(buf);
TORRENT_ASSERT(m_magic == 0x1337);
TORRENT_ASSERT(m_settings_set);
TORRENT_ASSERT(l.owns_lock());
TORRENT_UNUSED(l);
page_free(buf);
--m_in_use;
}
示例8: schedule_thread
// schedule a high priority task after a given time interval
void interval_timer::schedule_thread(std::unique_lock<mutex_type> & l)
{
HPX_ASSERT(l.owns_lock());
using namespace hpx::threads;
error_code ec;
// create a new suspended thread
threads::thread_id_type id;
{
// FIXME: registering threads might lead to thread suspension since
// the allocators use hpx::lcos::local::spinlock. Unlocking the
// lock here would be the right thing but leads to crashes and hangs
// at shutdown.
//util::unlock_guard<std::unique_lock<mutex_type> > ul(l);
id = hpx::applier::register_thread_plain(
util::bind(&interval_timer::evaluate,
this->shared_from_this(), util::placeholders::_1),
description_.c_str(), threads::suspended, true,
threads::thread_priority_boost, std::size_t(-1),
threads::thread_stacksize_default, ec);
}
if (ec) {
is_terminated_ = true;
is_started_ = false;
return;
}
// schedule this thread to be run after the given amount of seconds
threads::set_thread_state(id,
boost::chrono::microseconds(microsecs_),
threads::pending, threads::wait_signaled,
threads::thread_priority_boost, ec);
if (ec) {
is_terminated_ = true;
is_started_ = false;
// abort the newly created thread
threads::set_thread_state(id, threads::pending, threads::wait_abort,
threads::thread_priority_boost, ec);
return;
}
id_ = id;
is_started_ = true;
}
示例9: addFunctionToHeap
void FunctionScheduler::addFunctionToHeap(
const std::unique_lock<std::mutex>& lock,
RepeatFunc&& func) {
// This function should only be called with mutex_ already locked.
DCHECK(lock.mutex() == &mutex_);
DCHECK(lock.owns_lock());
functions_.emplace_back(std::move(func));
if (running_) {
functions_.back().resetNextRunTime(steady_clock::now());
std::push_heap(functions_.begin(), functions_.end(), fnCmp_);
// Signal the running thread to wake up and see if it needs to change
// its current scheduling decision.
runningCondvar_.notify_one();
}
}
示例10: is_disk_buffer
bool disk_buffer_pool::is_disk_buffer(char* buffer
, std::unique_lock<std::mutex>& l) const
{
TORRENT_ASSERT(m_magic == 0x1337);
TORRENT_ASSERT(l.owns_lock());
TORRENT_UNUSED(l);
#if TORRENT_USE_INVARIANT_CHECKS
return m_buffers_in_use.count(buffer) == 1;
#elif defined TORRENT_DEBUG_BUFFERS
return page_in_use(buffer);
#else
TORRENT_UNUSED(buffer);
return true;
#endif
}
示例11: releaseItem
void CacheHost::releaseItem(Cacheable *item,
std::unique_lock<std::mutex> &lock) {
assert(lock.owns_lock());
assert(item != &p_sentinel);
item->p_alive = false;
p_activeFootprint -= item->getFootprint();
// remove the item from the list
Cacheable *less_recently = item->p_lessRecentlyUsed;
Cacheable *more_recently = item->p_moreRecentlyUsed;
less_recently->p_moreRecentlyUsed = more_recently;
more_recently->p_lessRecentlyUsed = less_recently;
lock.unlock();
item->release();
lock.lock();
}
示例12: add_new_always
bool add_new_always(std::size_t& added, thread_queue* addfrom,
std::unique_lock<mutex_type> &lk, bool steal = false)
{
HPX_ASSERT(lk.owns_lock());
#ifdef HPX_HAVE_THREAD_CREATION_AND_CLEANUP_RATES
util::tick_counter tc(add_new_time_);
#endif
if (0 == addfrom->new_tasks_count_.load(boost::memory_order_relaxed))
return false;
// create new threads from pending tasks (if appropriate)
boost::int64_t add_count = -1; // default is no constraint
// if we are desperate (no work in the queues), add some even if the
// map holds more than max_count
if (HPX_LIKELY(max_count_)) {
std::size_t count = thread_map_.size();
if (max_count_ >= count + min_add_new_count) { //-V104
HPX_ASSERT(max_count_ - count <
static_cast<std::size_t>((std::numeric_limits
<boost::int64_t>::max)()));
add_count = static_cast<boost::int64_t>(max_count_ - count);
if (add_count < min_add_new_count)
add_count = min_add_new_count;
if (add_count > max_add_new_count)
add_count = max_add_new_count;
}
else if (work_items_.empty()) {
add_count = min_add_new_count; // add this number of threads
max_count_ += min_add_new_count; // increase max_count //-V101
}
else {
return false;
}
}
std::size_t addednew = add_new(add_count, addfrom, lk, steal);
added += addednew;
return addednew != 0;
}
示例13: cancelFunction
void FunctionScheduler::cancelFunction(const std::unique_lock<std::mutex>& l,
FunctionHeap::iterator it) {
// This function should only be called with mutex_ already locked.
DCHECK(l.mutex() == &mutex_);
DCHECK(l.owns_lock());
if (running_) {
// Internally gcc has an __adjust_heap() function to fill in a hole in the
// heap. Unfortunately it isn't part of the standard API.
//
// For now we just leave the RepeatFunc in our heap, but mark it as unused.
// When its nextTimeInterval comes up, the runner thread will pop it from
// the heap and simply throw it away.
it->cancel();
} else {
// We're not running, so functions_ doesn't need to be maintained in heap
// order.
functions_.erase(it);
}
}
示例14: resume
void MultiTaskScheduler::resume(Task* task, std::unique_lock<Spinlock> lock) {
assert(lock.owns_lock());
assert(task->status == Starting || task->status == Listening || task->status == Suspended);
assert(!task->scheduled);
TaskStatus status = task->status;
task->resumes += 1;
task->scheduled = true;
lock.unlock();
if (status == Starting || status == Listening) {
std::unique_lock<Spinlock> lock(softMutex);
softTasks.push_front(task);
} else if (status == Suspended) {
std::unique_lock<Spinlock> lock(hardMutex);
hardTasks.push_front(task);
} else {
// Impossible.
__builtin_unreachable();
}
}
示例15: add_new_if_possible
bool add_new_if_possible(std::size_t& added, thread_queue* addfrom,
std::unique_lock<mutex_type> &lk, bool steal = false)
{
HPX_ASSERT(lk.owns_lock());
#ifdef HPX_HAVE_THREAD_CREATION_AND_CLEANUP_RATES
util::tick_counter tc(add_new_time_);
#endif
if (0 == addfrom->new_tasks_count_.load(boost::memory_order_relaxed))
return false;
// create new threads from pending tasks (if appropriate)
boost::int64_t add_count = -1; // default is no constraint
// if the map doesn't hold max_count threads yet add some
// FIXME: why do we have this test? can max_count_ ever be zero?
if (HPX_LIKELY(max_count_)) {
std::size_t count = thread_map_.size();
if (max_count_ >= count + min_add_new_count) { //-V104
HPX_ASSERT(max_count_ - count <
static_cast<std::size_t>((std::numeric_limits
<boost::int64_t>::max)()));
add_count = static_cast<boost::int64_t>(max_count_ - count);
if (add_count < min_add_new_count)
add_count = min_add_new_count;
}
else {
return false;
}
}
std::size_t addednew = add_new(add_count, addfrom, lk, steal);
added += addednew;
return addednew != 0;
}