草庐IT

c++ - shared_mutex 锁排序

我的印象是,如果获取了太多共享锁,使用c++17的std::shared_mutex实现的多读/单写模式可能永远不会放弃唯一锁。在cppreference上挖掘之后,我不确定情况是否如此。具体来说:Alllockandunlockoperationsonasinglemutexoccurinasingletotalorder例如,给定以下对shared_mutex的操作,我相信unique_lock可能永远不会获得。假设无限量的shared_locks,并且这些锁在第一个shared_locks释放之前获得。shared_lockshared_lockshared_lockunique

具有非平凡类型的 C++ 原子?

阅读boost::atomic上的文档和std::atomic让我感到困惑的是atomic是否接口(interface)应该支持非平凡类型?也就是说,给定一个只能通过将读/写包含在一个完整的互斥锁中来写/读的(值)类型,因为它有一个非平凡的复制构造函数/赋值运算符,这应该是由std::atomic支持(因为boost明确指出它是UB)。我应该提供特化吗docs谈论我自己的非平凡类型?注意:我之所以想到这个是因为我有一个跨线程回调对象boost::functionsimpleFn;需要自动设置/重置。拥有一个单独的互斥锁/关键部分,或者甚至将两者都包装在一个类似原子的辅助类型中,使用简单

c++ - CUDA、互斥量和 atomicCAS()

最近开始在CUDA上开发,遇到了atomicCAS()的问题。要在设备代码中对内存进行一些操作,我必须创建一个互斥量,以便只有一个线程可以在代码的关键部分使用内存。下面的设备代码在1个block和多个线程上运行。__global__voidcudaKernelGenerateRandomGraph(...,int*mutex){inti=threadIdx.x;...do{atomicCAS(mutex,0,1+i);}while(*mutex!=i+1);//criticalsection//dosomemanipulationswithobjectsindevicememory*m

c++ - C++17 std::shared_mutex 还不可用吗?

查看C++compilersupport,看来std::shared_mutex的未计时版本在GCC5.0+中可用。但是,即使使用gccversion5.3.020151204(Ubuntu5.3.0-3ubuntu1~14.04),并用-std=c++1z编译,共享互斥体的简单初始化以:error:‘shared_mutex’innamespace‘std’doesnotnameatypestd::shared_mutexmutex_;不,我已经包含了正确的header:#include.它找不到正确的header,因为它似乎不存在。实际上,链接器使用位于/usr/include/c

c++ - 为什么要把 std::lock 放在 std::lock_guard 之前

继续ConcurrencyInAction我已经达到了下面的例子。作者指出,如果我们每次都锁定2mutexes同样的顺序,那么我们保证避免deadlocks.考虑书中的这个例子:classX{private:some_big_objectsome_detail;std::mutexm;public:X(some_big_objectconst&sd):some_detail(sd){}friendvoidswap(X&lhs,X&rhs){if(&lhs==&rhs){return;}std::lock(lhs.m,rhs.m);std::lock_guardlock_a(lhs.m,

c++ - 使用 std::mutex 复制类

我有一个以std::mutex作为成员的类。我正在尝试创建此类的数组classC{intx;std::mutexm;};intmain(){Cc[10];//latertryingtocreateatempCCtemp=c[0];}显然上述情况是不可能的,因为互斥对象是不可复制的。解决方法是通过拷贝构造函数。但是,我在创建复制构造函数时遇到了问题。我试过了C(constC&c){x=c.x;//1.m//2.m()//3.m=c.m}我不确定这3个选项中哪个是正确的语法。请帮忙。 最佳答案 你不应该写任何这些行。您的复制构造函数的实

c++ - 这是线程安全 Queue 类的正确方法吗?

我想知道这是否是用C++编写线程安全队列的正确方法?templateclassQueue{public:Queue(){}voidPush(T&a){m_mutex.lock();m_q.push_back(a);m_mutex.unlock();}T&Pop(){m_mutex.lock();T&temp=m_q.pop();m_mutex.unlock();returntemp;}private:std::queuem_q;boost::mutexm_mutex;};你明白了……我只是想知道这是否是最好的方法。谢谢!编辑:由于我收到的问题,我想澄清互斥锁是一个boost::mute

c++ - 独立的多线程进程同时阻塞

系统是Linux(Gentoox64),代码是C++。我有一个守护程序应用程序,它的多个实例在同一台机器上运行。该应用程序本身是多线程的。一段时间以来,我一直在观察其性能的奇怪延迟。在放置了一些调试代码后,我想到了一个奇怪的事情,当守护进程的几个实例同时阻塞时,据称是由某些外部原因或其他原因引起的。简单来说,我有一个这样的序列:记录时间(t1)锁定互斥体调用C++std::list::push_back()/pop_back()(即非常简单的数学运算)解锁互斥锁记录时间(t2)有时,我清楚地看到上面的序列在几个独立的(!)进程中运行,在第2步(或可能在第4步)阻塞了一些与第3步数学相关

c++ - 为什么使用 std::mutex 的函数会对 pthread_key_create 的地址进行空检查?

采用这个简单的函数,在由std::mutex实现的锁下递增整数:#includestd::mutexm;voidinc(int&i){std::unique_locklock(m);i++;}我希望这(在内联之后)以一种直接的方式编译为调用m.lock()增量i然后m.unlock().检查为最新版本的gcc和clang生成的程序集,但是,我们发现了一个额外的复杂问题。先拿gcc版本:inc(int&):moveax,OFFSETFLAT:__gthrw___pthread_key_create(unsignedint*,void(*)(void*))testrax,raxje.L2p

c++ - 当其他进程可能正在使用它时删除 boost interprocess_mutex

我正在尝试将interprocess_mutex与managed_windows_shared_memory一起使用。在我的项目中,多个进程在以下代码中创建了一个classA的实例。usingnamespaceboost::interprocess;classA{managed_windows_shared_memory*_shm;interprocess_mutex*_mtx;}A::A(){_shm=newmanaged_windows_shared_memory{open_or_create,"shm",1024};_mtx=_shm->find_or_construct("mt