草庐IT

lock_wrapper

全部标签

c++ - Boost Thread 的 boost::unique_lock 是作用域锁吗?

我了解由boost::mutex::scoped_lock锁定的变量在超出范围时会自动解锁。boost::unique_lock怎么样,变量超出范围时会自动解锁吗?任何人也可以指出该功能的引用。doublex;boost::mutexx_mutex;voidfoo(){{boost::unique_locklock(x_mutex);x=rand();}......somecalculationwhichtakes10second............isxstilllockedhere???......}谢谢。 最佳答案 sco

c++ - 使用 std::mutex、std::condition_variable 和 std::unique_lock

我在理解条件变量及其在互斥锁中的使用方面遇到了一些问题,希望社区可以帮助我。请注意,我来自win32背景,所以我与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。这是我第一次尝试使用c++11标准库进行并发,它是programexamplefoundhere的修改版本.#include#include#include#include#include#include#includeint_tmain(intargc,_TCHAR*argv[]){std::queuenNumbers;std::mutexmtxQueu

c++ - lambda wrapper 对可变参数模板函数调用引起的 gcc 段错误

我今天花了好几个小时tryingtounderstandwhythiscodeg++6.2和g++7.0上的段错误,同时在clang++3.9(和4.0).我将问题简化为85linesself-containedcodesnippet,正常执行时不会出现段错误,但总是在UBSAN下报错。问题isreproducibleonwandbox,通过使用g++7进行编译,启用优化并将-fsanitize=undefined作为额外标志传递。这是UBSAN报告的内容:prog.cc:Infunction'intmain()':prog.cc:61:49:warning:'ns#0'isusedu

c++ - 是否将 unique_lock 用于可以由 lock_guard 完成的任务较慢?

我对lock_guard存在的原因感到困惑。是吗:比unique_lock更简单的界面?比unique_lock性能更好?还有什么? 最佳答案 lock_guard可以用一个状态单元来实现:指针或对它已锁定的Mutex类型的引用。unique_lock必须保持该状态,并且知道当前是否被锁定,因为unique_lock可以有一个Mutex未锁定。这意味着它必须至少有一个额外状态的bool。lock_guard围绕获取和释放Mutex提供了一个零开销的RAII锁定/解锁包装器。基本上lock_guard意味着没有理由避免使用RAII来处

c++ - 为什么 Boost scoped_lock 不解锁互斥锁?

我一直在以这种方式使用boost::mutex::scoped_lock:voidClassName::FunctionName(){{boost::mutex::scoped_lockscopedLock(mutex_);//dostuffwaitBoolean=true;}while(waitBoolean==true){sleep(1);}//getonwiththethread'sactivities}基本上它设置waitBoolean,而另一个线程通过将waitBoolean设置为false来表示它已完成;然而,这似乎不起作用,因为其他线程无法锁定mutex_!!我假设通过将

c++ - 为什么 is_lock_free 是成员函数?

is_lock_free需要实例(它是成员函数)的原因是什么?为什么不是该类型的元函数,或者静态constexpr成员函数?我正在寻找一个实际的例子来说明为什么它是必要的。 最佳答案 标准允许类型有时无锁。section29.4Lock-freepropertyTheATOMIC_..._LOCK_FREEmacrosindicatethelock-freepropertyofthecorrespondingatomictypes,withthesignedandunsignedvariantsgroupedtogether.The

c++ - 使用 boost::lock_guard 进行简单的共享数据锁定

我是Boost库的新手,我正在尝试实现一个在共享队列上运行的简单生产者和消费者线程。我的示例实现如下所示:#include#include#includeboost::mutexmutex;std::dequequeue;voidproducer(){while(true){boost::lock_guardlock(mutex);std::coutlock(mutex);if(!queue.empty()){std::cout这段代码按我的预期运行,但是当main退出时,我得到/usr/include/boost/thread/pthread/mutex.hpp:45:boost::

c++ - scoped_lock 可以在读取模式下锁定 shared_mutex 吗?

C++17引入了std::shared_mutex和std::scoped_lock。我现在的问题是,当它作为参数传递时,scoped_lock将始终以独占(写入器)模式锁定共享互斥锁,而不是在共享(读取器)模式下。在我的应用程序中,我需要使用来自对象src的数据更新对象dst。我想锁定src共享和dst独占。不幸的是,如果同时调用另一个带有src和dst切换的更新方法,这可能会导致死锁。所以我想使用std::scoped_lock的花哨的死锁避免机制。我可以使用scoped_lock在独占模式下同时锁定src和dst,但是这种不必要的严格锁定会在其他地方产生性能回退。但是,似乎可以将

c++ - scoped_lock 如何避免发出 "unused variable"警告?

boost::mutex::scoped_lock是一个方便的RAII包装器,用于锁定互斥锁。我对其他事情使用了类似的技术:一个RAII包装器,它要求数据接口(interface)从/重新连接到串行设备。不过,我想不通的是,为什么在下面的代码中只有我的对象mst(其实例化和销毁确实有副作用)会导致g++发出“未使用的变量”警告错误,而l设法保持沉默。你知道吗?你能告诉我吗?[generic@sentinel~]$cattest.cpp#include#include#includestructMyScopedThing;structMyWorkerObject{voida(){std:

c++ - 第一次锁定和创建 lock_guard(adopt_lock) 和创建 unique_lock(defer_lock) 和锁定有什么区别?

我找到了以下两段代码:http://en.cppreference.com/w/cpp/thread/lockvoidassign_lunch_partner(Employee&e1,Employee&e2){//usestd::locktoacquiretwolockswithoutworryingabout//othercallstoassign_lunch_partnerdeadlockingus{//misthestd::mutexfieldstd::unique_locklk1(e1.m,std::defer_lock);std::unique_locklk2(e2.m,st