草庐IT

lock-free

全部标签

c++ - boost::lock 在 boost 1.53 中无法编译

我正在编译一个项目。它有以下几行:boost::mutex::scoped_lockml(m_meta_mut,boost::defer_lock);boost::mutex::scoped_locktl(m_tables_mut,boost::defer_lock);boost::lock(ml,tl);我在第三行收到lockisnotamemberofboost。我用的是boost1.53(项目推荐1.49)问题是什么 最佳答案 将我的评论变成更完整的答案。boost::lock()功能是definedinboost/threa

c++ - 其他线程是否会在合理的时间内看到对 `volatile` 字大小变量的写入?

当询问morespecificproblem时我发现这是人们不确定的核心问题。可以做出以下假设:CPU确实使用了像MESI(F)这样的缓存一致性协议(protocol)(例如:x86/x86_64和ARMv7mp)假定变量的大小由处理器自动写入/读取(对齐和native字大小)变量被声明为volatile问题是:如果我在一个线程中写入变量,其他线程会看到变化吗?其他线程看到变化的时间范围的数量级是多少?您是否知道缓存一致性不足以确保跨CPU/跨核心可见性的架构?问题不是:使用这样的变量安全吗?关于重新排序问题关于C++11原子这可能被认为是InC/C++,arevolatilevari

c++ - C++ 无锁队列实现中的虚假下溢

我正在尝试实现一个使用线性循环缓冲区来存储数据的无锁队列。与通用无锁队列相比,我有以下放宽条件:我知道将存储在队列中的最坏情况下元素的数量。队列是对一组固定元素进行操作的系统的一部分。代码永远不会尝试在队列中存储更多元素,因为此固定集合中有元素。没有多生产者/多消费者。队列将用于多生产者/单消费者或单生产者/多消费者设置。概念上,队列实现如下标准二次幂环形缓冲区。底层数据结构是一个使用power-of-twotrick的标准环形缓冲区。.读写索引只会递增。当使用简单的位掩码对数组进行索引时,它们被限制在底层数组的大小。读指针在pop()中以原子方式递增,写指针在push()中以原子方式

c++ - 加载或存储可以在有条件之前重新排序吗?

std::atomic_uint64_twriting_{0};std::atomic_uint64_treading_{0};std::arraystorage_{};booltry_enqueue(typet)noexcept{conststd::uint64_twriting{writing_.load(std::memory_order::memory_order_relaxed)};constautolast_read{reading_.load(std::memory_order::memory_order_relaxed)};if(writing-last_read在上面

c++ - Reader Writer Lock 支持低优先级的写者

我正在尝试寻找(或实现)支持低优先级写入器的读取器/写入器锁,但未能成功研究任何现有解决方案。我所说的低优先级写入器的意思是:“将让位给即将到来的读者或普通写入器”。如果有持续不断的读者流,肯定会导致饥饿,但这可以通过定时锁变体(“尝试定时低优先级写入器锁”,然后在超时时切换到正常锁)或通过更改来解决读取器的发布方式(可能会定期暂停读取一小段时间)。如果有任何文献描述这些东西,我还没有找到。如果有利用常规锁的已知(正确!)解决方案,我将不胜感激。 最佳答案 我不知道有什么100%像你的建议,但有一些现有的接口(interface)很

c++ - std::atomic 用于内置类型 - 非无锁与琐碎的析构函数?

查看std::atomic这是我阅读的默认专业:Thesespecializationshavestandardlayout,trivialdefaultconstructors,andtrivialdestructors.我还阅读了is_lock_free:Allatomictypesexceptforstd::atomic_flagmaybeimplementedusingmutexesorotherlockingoperations,ratherthanusingthelock-freeatomicCPUinstructions.Atomictypesarealsoallowed

c++ - 在 C++ 中用 new/delete 替换 malloc/free

我只是想确定一下。这是我的代码int*Image=(int*)malloc(sizeof(int)*m_Width/2*m_Height);free(Image);如果我想使用new而不是malloc和free而不是delete。这是我写的int*Image=newint[m_Width/2*m_Height];delete[]Image;对吗? 最佳答案 从技术上讲,这是正确的。然而,这是我们正在谈论的C++,动态分配数组的C++方法是使用std:vector代替:std::vectorImage(m_Width/2*m_Heig

c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?

推荐的使用方式mutex用于锁定代码的关键区域是通过RAII,即mutex_typemutex;{//startofcriticalregionstd::lock_guardlock(mutex);//firststatementincriticalregion//...docriticalstuff,maythrowanexception}//endofcriticalregion这样当在临界区内抛出异常时,互斥量仍将被解锁(由std::lock_guard的析构函数)。然而,这样的成员mutex::lock()和mutex::unlock()永远不会被用户代码显式调用。Qmutex

c++ - 无锁pop()中使用引用参数返回值的缺点

我目前正在阅读Williams的“C++ConcurrencyinAction”。现在我停止了专门讨论无锁pop()实现的话题。无锁弹出:voidpop(T&result){node*old_head=head.load();while(!head.compare_exchange_weak(old_head,old_head->next));result=old_head->data;}这里引用这段代码的讨论:Thesecondproblemisanexception-safetyissue.Whenwefirstintroducedthethread-safestackbackin

c++ - Effective placement of lock_guard - 来自 Effective Modern C++ 的第 16 条

在第16项:“使const成员函数线程安全”中有一段代码如下:classWidget{public:intmagicValue()const{std::lock_guardguard(m);//lockmif(cacheValid)returncachedValue;else{autoval1=expensiveComputation1();autoval2=expensiveComputation2();cachedValue=val1+val2;cacheValid=true;returncachedValue;}}//unlockmprivate:mutablestd::mute