本文整理汇总了C++中std::unique_lock类的典型用法代码示例。如果您正苦于以下问题:C++ unique_lock类的具体用法?C++ unique_lock怎么用?C++ unique_lock使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了unique_lock类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: stop_client
void F::stop_client (std::unique_lock <std::mutex> &lock)
{
bool wasLocked;
if (lock) {
wasLocked = true;
}
if (!wasLocked) {
lock.lock();
}
if (client) {
client->stop();
}
terminate = true;
lock.unlock();
GST_DEBUG ("Waiting for client thread to finish");
clientThread.join();
if (wasLocked) {
lock.lock();
}
}
示例2: catch
std::cv_status s4u::ConditionVariable::wait_for(std::unique_lock<Mutex>& lock, double timeout) {
try {
simcall_cond_wait_timeout(cond_, lock.mutex()->mutex_, timeout);
return std::cv_status::timeout;
}
catch (xbt_ex& e) {
// If the exception was a timeout, we have to take the lock again:
if (e.category == timeout_error) {
try {
lock.mutex()->lock();
return std::cv_status::timeout;
}
catch (...) {
std::terminate();
}
}
// Another exception: should we reaquire the lock?
std::terminate();
}
catch (...) {
std::terminate();
}
}
示例3: maybe_notify
void alert_manager::maybe_notify(alert* a, std::unique_lock<std::mutex>& lock)
{
if (m_alerts[m_generation].size() == 1)
{
lock.unlock();
// we just posted to an empty queue. If anyone is waiting for
// alerts, we need to notify them. Also (potentially) call the
// user supplied m_notify callback to let the client wake up its
// message loop to poll for alerts.
if (m_notify) m_notify();
// TODO: 2 keep a count of the number of threads waiting. Only if it's
// > 0 notify them
m_condition.notify_all();
}
else
{
lock.unlock();
}
#ifndef TORRENT_DISABLE_EXTENSIONS
for (auto& e : m_ses_extensions)
e->on_alert(a);
#else
TORRENT_UNUSED(a);
#endif
}
示例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: 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);
}
示例6: deallocateXLarge
void Heap::deallocateXLarge(std::unique_lock<StaticMutex>& lock, void* object)
{
Range toDeallocate = m_xLargeObjects.pop(&findXLarge(lock, object));
lock.unlock();
vmDeallocate(toDeallocate.begin(), toDeallocate.size());
lock.lock();
}
示例7: DeviceCmdSetMode
CS_StatusValue UsbCameraImpl::DeviceCmdSetMode(
std::unique_lock<wpi::mutex>& lock, const Message& msg) {
VideoMode newMode;
if (msg.kind == Message::kCmdSetMode) {
newMode.pixelFormat = msg.data[0];
newMode.width = msg.data[1];
newMode.height = msg.data[2];
newMode.fps = msg.data[3];
m_modeSetPixelFormat = true;
m_modeSetResolution = true;
m_modeSetFPS = true;
} else if (msg.kind == Message::kCmdSetPixelFormat) {
newMode = m_mode;
newMode.pixelFormat = msg.data[0];
m_modeSetPixelFormat = true;
} else if (msg.kind == Message::kCmdSetResolution) {
newMode = m_mode;
newMode.width = msg.data[0];
newMode.height = msg.data[1];
m_modeSetResolution = true;
} else if (msg.kind == Message::kCmdSetFPS) {
newMode = m_mode;
newMode.fps = msg.data[0];
m_modeSetFPS = true;
}
// If the pixel format or resolution changed, we need to disconnect and
// reconnect
if (newMode.pixelFormat != m_mode.pixelFormat ||
newMode.width != m_mode.width || newMode.height != m_mode.height) {
m_mode = newMode;
lock.unlock();
bool wasStreaming = m_streaming;
if (wasStreaming) DeviceStreamOff();
if (m_fd >= 0) {
DeviceDisconnect();
DeviceConnect();
}
if (wasStreaming) DeviceStreamOn();
Notifier::GetInstance().NotifySourceVideoMode(*this, newMode);
lock.lock();
} else if (newMode.fps != m_mode.fps) {
m_mode = newMode;
lock.unlock();
// Need to stop streaming to set FPS
bool wasStreaming = m_streaming;
if (wasStreaming) DeviceStreamOff();
DeviceSetFPS();
if (wasStreaming) DeviceStreamOn();
Notifier::GetInstance().NotifySourceVideoMode(*this, newMode);
lock.lock();
}
return CS_OK;
}
示例8: runItemWithoutLock
void WorkQueue::runItemWithoutLock(std::unique_lock<std::mutex> &lock) {
Item item = std::move(item_heap.front());
std::pop_heap(std::begin(item_heap), std::end(item_heap));
item_heap.pop_back();
idle_flag = false;
lock.unlock();
item.func();
lock.lock();
idle_flag = true;
cond.notify_all();
}
示例9: 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)));
}
示例10: 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());
}
示例11: DeviceGet
bool UsbCameraProperty::DeviceGet(std::unique_lock<wpi::mutex>& lock,
IAMVideoProcAmp* pProcAmp) {
if (!pProcAmp) return true;
lock.unlock();
long newValue = 0, paramFlag = 0; // NOLINT(runtime/int)
if (SUCCEEDED(pProcAmp->Get(tagVideoProc, &newValue, ¶mFlag))) {
lock.lock();
value = newValue;
return true;
}
return false;
}
示例12: DeviceSet
bool UsbCameraProperty::DeviceSet(std::unique_lock<wpi::mutex>& lock,
IAMVideoProcAmp* pProcAmp,
int newValue) const {
if (!pProcAmp) return true;
lock.unlock();
if (SUCCEEDED(
pProcAmp->Set(tagVideoProc, newValue, VideoProcAmp_Flags_Manual))) {
lock.lock();
return true;
}
return false;
}
示例13: remove_oldest
void file_pool::remove_oldest(std::unique_lock<std::mutex>& l)
{
file_set::iterator i = std::min_element(m_files.begin(), m_files.end()
, boost::bind(&lru_file_entry::last_use, boost::bind(&file_set::value_type::second, _1))
< boost::bind(&lru_file_entry::last_use, boost::bind(&file_set::value_type::second, _2)));
if (i == m_files.end()) return;
file_handle file_ptr = i->second.file_ptr;
m_files.erase(i);
// closing a file may be long running operation (mac os x)
l.unlock();
file_ptr.reset();
l.lock();
}
示例14: push_and_notify_
channel_op_status push_and_notify_( ptr_t new_node,
std::unique_lock< mutex > & lk) noexcept {
push_tail_( new_node);
lk.unlock();
not_empty_cond_.notify_one();
return channel_op_status::success;
}
示例15: 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();
}
}