草庐IT

c++ - 使用互斥锁和手动锁定互斥锁的区别

具体来说,如果我使用mutex.lock(),则在const成员函数中在它的开头,和mutex.unlock()就在返回之前,我在OpenMP循环中运行它时崩溃了。但是如果我用一个QMutexLocker(&mutex)替换这两个调用在功能开始时,它运行顺利。VisualStudio2010,Qt4.8。我希望这两个代码是等价的,但显然不是。我在这里缺少什么?编辑:虽然这不会重现问题,但举个小例子:classTileCache{public:boolfillBuffer(conststd::string&name)const{//QMutexLockerlock(&mCacheMute

c++ - 无锁实现中没有互斥锁的条件变量

我有一个使用std::atomics实现的无锁单生产者多消费者队列以类似于HerbSuttersCPPCon2014演讲的方式。有时,生产者速度太慢,无法满足所有消费者的需求,因此消费者可能会挨饿。我想防止饥饿的消费者排队,因此我为10ms添加了一个sleep。.这个值是任意的,不是最优的。我想使用一个信号,一旦队列中再次有空闲槽,消费者就可以发送给生产者。在基于锁的实现中,我自然会使用std::condition_variable为了这个任务。但是,现在在我的无锁实现中,我不确定引入mutex是否是正确的设计选择。,只能使用std::condition_variable.我只想问你,

使用 std::atomic 的 C++ 线程安全增量,带模而不带互斥锁

我需要一个以循环方式使用的线程安全缓冲区对象池。我通常会在其中放置一个互斥锁以使增量和模线程安全,但是是否可以使用std::atomic来编写它?这是一个示例界面。如果它使事情变得更容易,缓冲区的总数可以是2的幂。永远不会在类外访问下一个缓冲区索引。classBuffer;classBufferManager{public:BufferManager(size_ttotalBuffers=8):mNextBufferIndex(0),mTotalBuffers(totalBuffers){mBuffers=newBuffer*[mTotalBuffers];}Buffer*GetNex

c++ - 为什么condition_variable在producer-consumer中等待锁呢? C++

看下面经典的生产者消费者代码:intmain(){std::queueproduced_nums;std::mutexm;std::condition_variablecond_var;booldone=false;boolnotified=false;std::threadproducer([&](){for(inti=0;ilock(m);std::coutlock(m);while(!done){while(!notified){//looptoavoidspuriouswakeupscond_var.wait(lock);}while(!produced_nums.empty(

c++ - 实际上,C++11 中 std::atomic 的内存占用是多少?

我正在编写的一个程序需要在ram中存储大量数据(几千兆字节)以供多个线程原子访问。std::atomic似乎是一种合理的方式来做到这一点,因为它的访问可能比将所有访问包装在一个或多个std::mutex中更有效。s,因为,最坏的情况下,它将在内部使用互斥量并且是等效的。我的数据组织为一组Chunk对象,除其他外,它们有一个包含大部分数据的数组成员。现在,我正在考虑将其定义为std::array,SOME_CONSTANT_HERE>,但这只有在内存占用为std::atomic时才会有效在内置类型上,例如unsignedint不比unsignedint差本身,因为根据我的计算,以我需要存

c++ - C++ 静态初始化在同一个回溯中出现两次是否正常?

我正在尝试调试使用GCC编译的C++程序,该程序在启动时卡住。GCCmutex保护函数的静态局部变量,似乎等待获取这样的锁是它卡住的原因。这是如何发生的相当令人困惑。第一个模块A的静态初始化发生(GCC调用的__static_init函数在回溯中可见),它调用具有静态局部变量的函数Foo()。静态局部变量是构造函数调用了好几层函数的对象,然后回溯突然有几个??的,然后它在第二个模块B的静态初始化中(__static函数再次出现),然后调用Foo(),但由于Foo()从未在第一次返回时本地静态变量上的互斥量仍然设置,因此它锁定。一个静态初始化如何触发另一个?我的第一个理论是共享库——模块

c++ - 按值返回由互斥量保护的 shared_ptr 是否安全?

这是一个代码示例:classA{boost::mutexa_mutex;boost::shared_ptra;boost::shared_ptrclone_a(void){boost::lock_guardlock(a_mutex);returna;}};建议boost::shared_ptr对A::a的复制构造函数调用将在boost::lock_guard析构函数调用之前尽管有编译器优化。那么,调用A::clone_a()安全吗? 最佳答案 如果您所说的“安全”是指您不会在a上发生数据竞争,那么是的。正如你所说。但是,正如您可能知

c++ - 是否可以使用互斥锁来锁定 vector 中的元素而不是整个 vector ?

是否可以使用互斥量来锁定vector中的元素而不是整个vector?例如,给定一个vectormyVec;将10个元素推回myVecfor(inti=0;ivector的每个元素将被多个线程异步更改。如何使用互斥锁只锁定myVec中的一个缓冲区,以便一个线程可以写入或读取一个元素;另一个可以同时读写另一个元素吗?谢谢 最佳答案 你想要的比你想象的更简单也更难:如果你的容器作为一个整体没有变化,即没有插入或删除,那么标准库容器已经提供了有限类型的线程安全,即允许不同的线程读取或修改不同的容器元素,即只要不超过一个线程访问任何给定元素。

c++ - 测量互斥量争用/解释互斥量输出

我正在尝试使用mutrace测量我的程序中的互斥锁争用,但我对如何使用它输出的报告感到困惑。mutrace:Showingstatisticsforprocesstest(PID:5924).mutrace:1223mutexesused.Mutex#362(0x0x1a23750)firstreferencedby:/usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2)[0x7fb6b14129b4]./test()[0x500042]Mutex#390(0x0x1a23ac0)firstreferencedby:/usr/loc

c++ - std::mutex 是否支持拥有它的线程?

我试图了解如何spinlockmutex作品,所以我写了一个简单的代码(如下所示)来测量来自受自旋锁(或std::)互斥锁保护的不同线程。令人惊讶的是,它显示(至​​少在gcc中)std::mutex(与自旋锁互斥锁相反)似乎有利于拥有它的线程,导致非常小的指令交错(最多5%),除非有问题的指令非常快(比如递增计数器)。在那种情况下,我们甚至可以获得50%。自旋锁互斥体至少提供80%(通常超过90%)。这是众所周知的事实吗?或者我下面的代码可能有错误?我的意思是,我知道经验法则说互斥体应该始终锁定最短的时间。但我确信是这样的,因为我们想减少线程的序列化,而不是因为std::mutex有