草庐IT

auto-lock

全部标签

c++ - 即使一切看起来都是 "good", std::mutex::lock 也会抛出吗?

来自CPPReference,没有明确说明如果锁定不会导致死锁,则std::mutex的锁定函数不会抛出。PThread'slock只有死锁错误。我不知道窗口对线程的实现。我也不知道它们是否是用作std::thread/std::mutex后端的线程的其他实现。所以我的问题是“我是否应该编写我的代码,就好像有时候,由于没有特殊原因,锁定可能会失败?”。我实际上需要在某些noexcept方法中锁定一个互斥量,并且我想确保它们是noexcept。 最佳答案 std::mutex::lock()成员函数未声明为noexcept并且来自30

C++11 auto、std::function 和对重载函数的模糊调用

我想知道是否有人知道为什么以下示例无法编译并给出对重载函数错误的模糊调用。如果我用强类型仿函数签名替换auto,它就能够正确区分两个方法重载。我注意到当不使用std::function作为我的重载参数时,不会发生同样的问题。如果我的重载只接受一个简单的float和int,即使使用auto关键字定义我的输入参数,编译器也可以正确区分这两个重载。我正在VisualStudio2012中编译它。这可能只是VS编译器中的错误吗?我现在无法访问装有GCC或Clang的机器,但有人知道这是否可以在那里编译吗?编译错误:对重载函数的调用不明确classAmbiguousOverload{public

c++ - 在 C++11 中,是否有 std::lock_guard 的变体在构造时解锁并在销毁时锁定?

有好几次我写了一些代码,可以从“反向”lock_guard中获益,就像在这个简短的例子中一样。std::lock_guardlg(_eventQueueMutex);while(!_eventQueue.empty()){Evente=_eventQueue.top();_eventQueue.pop();_eventQueueMutex.unlock();//ManualunlockdispatchEvent(e);_eventQueueMutex.lock();//Manuallock}有没有办法用C++11中的自动lock_guard替换内部解锁/锁定?

c++ - 初始化 auto-inc 类型 vector 的 vector 时出现问题

我正在尝试生成一个包含递增数字的单元格的二次网格。#include#includeclassSimple{public:Simple():id(genId()){}staticintgenId(){staticintg_id=0;return++g_id;}intid;};typedefstd::vector>SimpleGrid;voidprintSimpleGrid(SimpleGrid&grid){for(inti=0;irow(dim);test[i]=row;}printSimpleGrid(test);return0;}我得到这个输出:111222333这与我的预期不同:1

c++ - mutex lock fail with invalid argument 是什么意思?

此代码在我的主进程中调用并编译正常,但在执行时总是抛出以下错误。bounded_bufferbb(200);Producer>producer(&bb);boost::threadproduce(producer);//throwsonthisline这里是执行时总是出现的错误。terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'what():boost:mutexlockfailedinpthread_mutex_lock:Invalidargument'classbounded_

c++ - auto a = A(3) 和 A a(3) 有什么区别?

假设我有:structA{A(intx):m_x(x){}A(A&&)=delete;intm_x;}和:Aa(3);//Okautoa=A(3);//Error:functionA(int&&)cannotbereferenced-it'sadeletedfunction为什么后者会调用移动构造函数?为什么这2个语句在生成的代码方面不同? 最佳答案 autoa=A(3);与Aa=A(3);相同,因为右侧的类型是A。这意味着它的样子:A(3)创建一个临时的A,用3初始化,然后是Aa=_____表示:创建一个名为a的A并使用_____

c++ - auto 作为函数参数

在C++14中,这样的事情是合法的(对于lambdas):-autol=[](autox,autoy){returnx+y;};但是这样的事情仍然是不合法的:-autosum(autox,autoy){returnx+y;}我的好奇心是为什么没有将第二个添加到标准中(尽管它应该有望添加到C++17中)?第二个的优点和缺点是什么? 最佳答案 它没有被添加,因为添加是另一回事,而且时间不是无限的。我们不能指望一次性添加所有有用的增强功能,对吗?正如您所确定的,它将在C++17中。 关于c++

c++ - 自旋锁与 std::mutex::try_lock

使用专门设计的自旋锁(例如http://anki3d.org/spinlock)与这样的代码相比有什么好处:std::mutexm;while(!m.try_lock()){}#doworkm.unlock(); 最佳答案 在典型的硬件上,有很多好处:您天真的“假自旋锁”可能会在CPU旋转时使内部CPU总线饱和,从而使其他物理内核(包括持有锁的物理内核)处于饥饿状态。如果CPU支持超线程或类似的东西,您天真的“假自旋锁”可能会消耗物理内核上的过多执行资源,使共享该物理内核的另一个线程处于饥饿状态。您天真的“假自旋锁”可能会执行无关的

c++ - `std::mutex` 和 `std::lock` 是否保证处理器间代码中的内存同步?

我目前正在使用openMP编写在多核节点上运行的代码。openMP有一个特定的内存模型,保证在获取锁时在不同内核上运行的线程之间内存是同步的。我考虑使用C++11构造(std::threadwithstd::mutexandstd::lock)而不是openMP(因为它们更大的灵active)并想知道处理器之间的内存同步是否/如何在这里得到保证?如果没有,我该如何执行? 最佳答案 该标准在§30.4.1.2[thread.mutex.requirements.mutex]/6-25中对std::mutex的同步做出了以下保证Thee

c++ - is_lock_free 未在 gcc 4.7.2 的 std::atomic<T> 中定义?

我遇到这个编译器错误functionstd::atomic::is_lock_free()const:error:undefinedreferenceto'__atomic_is_lock_free'whencompilingcodelikebelowusinggcc4.7.2onlinux.structS{inta;intb;};std::atomics;cout 最佳答案 AtomicAPIisn'tcompleteinGCC4.7:Whenlockfreeinstructionsarenotavailable(eitherth