草庐IT

c++ - 如果 `atomic<T>` 是无锁的并且大小与 `T` 相同,内存布局是否相同?

Thisquestionhere表示std::atomic通常应该与T具有相同的大小,而对于x86、x64和ARM上的gcc、clang和msvc,情况确实如此。在std::atomic的实现中对于某些类型总是无锁T,它的内存布局是否保证与T的内存布局相同??std::atomic是否有任何额外的特殊要求?,比如对齐? 最佳答案 在查看[atomics.types.generic]时,您链接的答案部分引用了该答案,关于对齐的唯一评论是您之前看到的注释:Note:Therepresentationofanatomicspecializ

c++ - atomic<T*> 总是无锁的吗?

在我的MAC操作系统上,atomic是无锁的。#include#includeintmain(){std::cout().is_lock_free()我想知道是否atomic总是无锁?有引用介绍吗? 最佳答案 Thestandardallowsimplementinganyatomictype(withexceptionofstd::atomic_flag)tobeimplementedwithlocks.即使平台允许某些类型的无锁原子,标准库开发人员也可能没有实现它。如果您需要在使用锁时实现不同的东西,可以在编译时使用ATOMIC

c++ - 无锁简单隔离存储算法

我正在使用C++开发“SimpleSegregatedStorage”内存池的无锁版本。SSS内存池类似于slab分配器:它基本上只是一block内存,被分成大小相等的block,我们有一个指向第一个可用block的空闲列表指针。分配只是将指针向上移动到下一个block,释放只是将空闲列表指针设置为释放block,并将释放block上的“下一个”指针指向自由列表指针的旧值。所以它基本上是一个单链表。现在,我正在尝试编写简单隔离存储算法的无锁版本。如果我们假设隔离初始内存块(即创建链表)总是在进入多线程环境之前完成,我们只需要担心分配和释放block——在这种情况下问题变得非常类似于无锁

c++ - C++ 智能指针是无锁的吗?

std::unique_ptr和/或std::shared_ptr的以下操作是否是无锁的?取消引用,即read(*myPtr)或myPtr->getSomething()删除引用,即使用std::move(myUniquePtr)或当std::shared_ptr超出范围时。在我的例子中,我并没有从多个线程同时访问这些指针。我只是好奇我是否可以在高优先级、无锁线程上专门使用它们。指针管理的对象在高优先级回调之前由主线程分配,并且在回调停止之前不会被释放。谢谢! 最佳答案 通过合理的实现,您可以假设:std::unique_ptr:对

c++ - 我可以使以下代码无锁/原子锁吗?

intval=memLoc[index++];或者更好intval=memLoc[index++&0xFF];尝试从共享环形缓冲区中进行线程安全读取,每次调用都会在其中获取下一个值-我希望它尽可能无锁,因为它发生了TON。不允许使用Boost/C++11:( 最佳答案 此处唯一需要同步的操作是index值的递增。由于这只是一个数值,因此可以通过原子增量在不使用锁的情况下完成。您列出的其余操作只是共享位置的读取,不需要同步。在Win32上同步增量是通过InterlockedIncrement函数完成的intoldValue=Inter

c++ - 寻找对我的线程安全、无锁队列实现的批评

所以,经过一些研究,我写了一个队列。它使用固定大小的缓冲区,因此它是一个循环队列。它必须是线程安全的,而且我已尝试使其无锁。我想知道它出了什么问题,因为这些事情我自己很难预测。这是标题:templateclassLockFreeQueue{public:LockFreeQueue(uintbuffersize):buffer(NULL),ifront1(0),ifront2(0),iback1(0),iback2(0),size(buffersize){buffer=newatomic[buffersize];}~LockFreeQueue(void){if(buffer)delete

c++ - 使用 InterlockedCompareExchange 无锁

我正在尝试使用互锁操作使以下代码片段无锁,知道如何翻译吗?if(m_Ref==0xFFFF)m_Ref=1;else{if(++m_Ref==1)CallSomething();//}我在想类似的东西if(InterlockedCompareExchange(&m_Ref,1,0xFFFF)!=0xFFFF)){if(InterlockedIncrement(&m_Ref)==1)CallSomething();}这里面有什么问题/竞争吗? 最佳答案 从表面上看这看起来是正确的,但每次您连续使用两个互锁操作时,您都会将自己暴露在AB

c++ - 用于成员变量无锁更新的环形分配器?

我有一个类存储一些传入实时数据的最新值(大约1.5亿个事件/秒)。假设它看起来像这样:classDataState{Eventlatest_event;public://pusheseventatomicallyvoidpush_event(constEvent__restrict__*e);//pullseventatomicallyEventpull_event();};我需要能够以原子方式推送事件并以严格的顺序保证拉取它们。现在,我知道我可以使用自旋锁,但考虑到大量事件发生率(超过1亿/秒)和高度并发,我更愿意使用无锁操作。问题是Event大小为64字节。没有CMPXCHG64B

c++ - 无锁队列中的内存管理

我们一直在寻求在我们的代码中使用无锁队列,以减少当前实现中单个生产者和消费者之间的锁争用。那里有很多队列实现,但我不太清楚如何最好地管理节点的内存管理。例如,生产者看起来是这样的:queue.Add(newWorkUnit(...));消费者看起来像:WorkUnit*unit=queue.RemoveFront();unit->Execute();deleteunit;我们目前使用内存池进行分配。您会注意到生产者分配内存而消费者删除它。由于我们正在使用池,因此我们需要向内存池添加另一个锁以正确保护它。这似乎首先否定了无锁队列的性能优势。到目前为止,我认为我们的选择是:实现无锁内存池。

C++11原子变量:线程安全、无锁操作的实例解析

 在C++11中,原子变量(std::atomic)提供了一种线程安全的方式来操作共享变量。下面是一个简单的例子,演示了C++11原子变量的用法。#include#include#includestd::atomiccounter(0);//声明一个原子整数变量voidincrementCounter(intid,intiterations){for(inti=0;i注意事项:原子性操作: 原子变量提供了原子性操作,避免了多线程同时访问共享变量时的竞争条件。无锁: 使用原子变量的操作是无锁的,因此在高并发的情况下可以获得更好的性能。适用类型: std::atomic 模板支持多种类型,例如整数