草庐IT

ruby - Ruby Array#[]= 预分配数组的线程安全吗?这可以无锁吗?

我已经用ruby​​编写了一些代码来通过线程池处理数组中的项目。在此过程中,我预先分配了一个与传入数组大小相同的结果数组。在线程池中,我在预分配数组中分配项目,但保证这些项目的索引是唯一的。考虑到这一点,我是否需要用Mutex#synchronize围绕赋值?例子:SIZE=1000000000defcollect_via_threadpool(items,pool_count=10)processed_items=Array.new(items.count,nil)index=-1length=items.lengthmutex=Mutex.newitems_mutex=Mutex.

c++ - c++ 是否存在多生产者单消费者无锁队列?

关闭。这个问题需要更多focused.它目前不接受答案。想要改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我读得越多,我就越困惑……我会认为找到一个用C++实现的正式正确的MPSC队列是微不足道的。每当我发现另一个问题时,进一步的研究似乎表明存在诸如ABA或其他微妙的竞争条件之类的问题。很多人都在谈论垃圾收集的必要性。这是我想避免的。那里有公认的正确开源实现吗? 最佳答案 您可能想检查破坏者;它在C++中可用:http://lmax-exchange.g

c++ - c++ 是否存在多生产者单消费者无锁队列?

关闭。这个问题需要更多focused.它目前不接受答案。想要改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我读得越多,我就越困惑……我会认为找到一个用C++实现的正式正确的MPSC队列是微不足道的。每当我发现另一个问题时,进一步的研究似乎表明存在诸如ABA或其他微妙的竞争条件之类的问题。很多人都在谈论垃圾收集的必要性。这是我想避免的。那里有公认的正确开源实现吗? 最佳答案 您可能想检查破坏者;它在C++中可用:http://lmax-exchange.g

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样

c++ - 原子变量是无锁的吗?

当我们谈论原子变量时,例如C++11的atomic,它是无锁的吗?或者无锁是什么不同的东西?如果我用原子变量管理队列,它会比无锁队列慢吗? 最佳答案 标准没有指定原子对象是否是无锁的。在不为类型T提供无锁原子操作的平台上,atomic对象可以使用互斥体来实现,互斥体不是无锁的。在这种情况下,任何在其实现中使用这些对象的容器也不会是无锁的。该标准确实提供了一种方法来检查atomic变量是无锁的:你可以使用var.is_lock_free()或atomic_is_lock_free(&var).这些函数保证总是为相同类型返回相同的值T在

c++ - 原子变量是无锁的吗?

当我们谈论原子变量时,例如C++11的atomic,它是无锁的吗?或者无锁是什么不同的东西?如果我用原子变量管理队列,它会比无锁队列慢吗? 最佳答案 标准没有指定原子对象是否是无锁的。在不为类型T提供无锁原子操作的平台上,atomic对象可以使用互斥体来实现,互斥体不是无锁的。在这种情况下,任何在其实现中使用这些对象的容器也不会是无锁的。该标准确实提供了一种方法来检查atomic变量是无锁的:你可以使用var.is_lock_free()或atomic_is_lock_free(&var).这些函数保证总是为相同类型返回相同的值T在

《JUC并发编程 - 高级篇》05 -共享模型之无锁 (CAS | 原子整数 | 原子引用 | 原子数组 | 字段更新器 | 原子累加器 | Unsafe类 )

文章目录五、共享模型之无锁5.1问题提出5.1.1为么不安全5.1.2解决思路1-锁5.1.3解决思路2-无锁5.2CAS与volatile5.2.1CAS和volatile的关系5.2.2为什么无锁效率高5.2.3CAS的特点5.3原子整数5.4原子引用5.4.1不安全实现5.4.2安全实现-使用锁5.4.3安全实现-使用CAS5.4.4ABA问题及解决5.5原子数组5.6字段更新器5.7原子累加器5.7.1累加器性能比较*源码之LongAdder5.7.2CAS锁*原理之伪共享5.8Unsafe5.8.1UnsafeCAS操作6.8.2unsafe对象模拟实现原子整数本章小结五、共享模型之

《JUC并发编程 - 高级篇》05 -共享模型之无锁 (CAS | 原子整数 | 原子引用 | 原子数组 | 字段更新器 | 原子累加器 | Unsafe类 )

文章目录五、共享模型之无锁5.1问题提出5.1.1为么不安全5.1.2解决思路1-锁5.1.3解决思路2-无锁5.2CAS与volatile5.2.1CAS和volatile的关系5.2.2为什么无锁效率高5.2.3CAS的特点5.3原子整数5.4原子引用5.4.1不安全实现5.4.2安全实现-使用锁5.4.3安全实现-使用CAS5.4.4ABA问题及解决5.5原子数组5.6字段更新器5.7原子累加器5.7.1累加器性能比较*源码之LongAdder5.7.2CAS锁*原理之伪共享5.8Unsafe5.8.1UnsafeCAS操作6.8.2unsafe对象模拟实现原子整数本章小结五、共享模型之

SQL Server 的 Nolock 到底是怎样的无锁

一、背景1.讲故事相信绝大部分用SQLSERVER作为底层存储的程序员都知道 nolock 关键词,即使当时不知道也会在踩过若干阻塞坑之后果断的加上 nolock,但这玩意有什么注意事项呢?这就需要了解它的底层原理了。二、nolock的原理1.sql阻塞还原为了方便讲述,先创建一个post表,插个 6 条记录,参考代码如下:CREATETABLEpost(idINTIDENTITY,contentchar(4000))GOINSERTINTOdbo.postVALUES('aaa')INSERTINTOdbo.postVALUES('bbb')INSERTINTOdbo.postVALUES(