主要的原因使用原子能超过互斥,是互斥是昂贵的,但与默认的内存模型atomics
是memory_order_seq_cst
,这不仅是因为贵吗?
问题:并发使用锁的程序可以和并发无锁程序一样快吗?
如果是这样,除非我想memory_order_acq_rel
用于原子,否则它可能不值得.
编辑:我可能会遗漏一些东西,但基于锁定不能比无锁更快,因为每个锁也必须是一个完整的内存屏障.但是,通过无锁,可以使用比内存障碍更少限制的技术.
那么回到我的问题,没有锁定比基于新的C++ 11标准的默认锁定更快memory_model
?
"无锁定> =在性能测量时基于锁定"是真的吗?我们假设有2个硬件线程.
编辑2:我的问题不是关于进度保证,也许我正在使用"无锁"脱离上下文.
基本上当你有2个共享内存线程时,你需要的唯一保证就是如果一个线程正在编写然后另一个线程无法读写,我的假设是简单的原子compare_and_swap
操作比锁定互斥锁要快得多.
因为如果一个线程甚至从未触及共享内存,您将无缘无故地反复锁定和解锁,但使用原子操作时,每次只使用1个CPU周期.
关于注释,当争用很少时,自旋锁与互斥锁是非常不同的.
我有多个线程需要使用TCP流中的数据.我希望在共享内存中使用循环缓冲区/队列来从TCP套接字读取.TCP接收将直接写入循环队列.消费者将从队列中读取.
此设计应启用零复制和零锁定.但是这里有两个不同的问题.
从TCP套接字读取1条逻辑消息是否可能/有效?如果没有,并且我阅读了多条消息,我将不得不将残差复制到此 - >下一步.
是否真的可以实现无锁队列?我知道有原子操作,但这些也很昂贵.因为所有CPU缓存都需要无效.这将影响我所有24个内核的所有操作.
我在低级TCP中有点生疏,并不清楚如何判断消息何时完成.我是在寻找\ 0还是具体实现?
TY
ZeroC ICE与0MQ相比如何?我知道0MQ/Crossroads和DDS非常相似,但似乎无法弄清楚ICE的位置.
我需要快速实现一个系统,将实时市场数据从C++卸载到C#,作为我项目的第一阶段.下一阶段将实现具有基础Pub/Sub设计的基于事件的架构.
我愿意使用TCP ..但系统当前正在一台24核服务器上运行..因此IPC选项会很好.根据我的理解,ICE只是TCP,而DDS和0mq有IPC选项.
目前,我倾向于使用Protobuf与ICE或Crossroads IO.已从OpenSplice DDS网站关闭.我已经对各种选项进行了大量研究,最初考虑的是OpenMPI + boost:mpi,但似乎没有针对.NET的MPI.
我的问题是:
ICE与0MQ相比如何?我无法绕过这个.无法在网上找到任何比较两者的东西.
提前致谢.
........关于我的项目的更多信息:
目前在Windows上使用CMAKE C++,但计划在某个时候转移到CentOS.另一个所需的特性是将tic数据和所有消息存储在"NoSql"数据库中,例如Hbase/Hadoop或HDF5.这些中间件/消息/ pub-sub库中的任何一个都有任何数据库集成吗?
class UDPClient
{
}
class LargeSimulator
{
}
class RemoteLargeSimulatorClient : UDPClient, LargeSimulator
{
}
Run Code Online (Sandbox Code Playgroud)
俗话说,如果你需要多重继承,那么你的设计是不对的.
如何在C#中完成此操作而无需实现任何内容?
class AlphaBase
{
public bool PropA { get; set; }
}
class AlphaA : AlphaBase
{
public bool PropB { get; set; }
}
class BetaBase
{
protected AlphaBase MAlpha;
public BetaBase(AlphaBase rAlpha)
{
MAlpha = rAlpha;
}
}
class BetaA : BetaBase
{
public BetaA(AlphaA rAlpha) : base(rAlpha) {}
void DoSomething()
{
if (MAlpha.PropA) ;
if (MAlpha.ProbB) ; //wont compile
}
}
Run Code Online (Sandbox Code Playgroud)
问题:如何在不为AlphA创建第二个变量的情况下使其工作.
BetaBase将使用MAlpha,BetaB也是如此..如何在没有强制转换且没有2个引用变量的情况下实现这一目标?
谢谢