我需要InterlockedExchange的等价物,我可以用它来为字符串分配字符串。 这个等价物应该可以在c ++中使用。我知道我可以开始实现我自己的基于互斥锁的解决方案,但是想知道是否有任何准备和优雅的东西。
谢谢。
答案 0 :(得分:5)
我不敢。 InterlockedExchange
的重点在于它(原子地)在单个32位或64位(具有64位版本)值上工作。字符串涉及内存分配,内存复制和边界检查,因此无法通过这种方式实现。
我认为,你得到的最接近的是通过交换两个字符串指针,使它们指向不同的东西(已经分配)。但即便如此,你怎么知道该字符串的内容没有被写入?
答案 1 :(得分:1)
如果你可以存储指向你的字符串的指针,你可以互相交换指针。你需要一种锁来交换实际的字符串。
答案 2 :(得分:0)
你可以有一个不可变的引用计数字符串类,使用boost :: shared_array作为底层类型甚至boost :: shared_ptr<来实现它很容易。 const std :: string>。 (这样做时,我经常会有一个固定大小的缓冲区用于短字符串。)
然后可以在分配时使用“互锁交换”来增加shared_ptr的引用计数。实际上,boost :: shared_ptr已经支持了这个,所以你不必自己写任何东西。
当我说字符串类是不可变的时,我的意思是你不能直接修改它中的字符串。但是,您可以提取std :: string的副本,修改它,然后将新的实际字符串附加到类中。
答案 3 :(得分:0)
没有直接的硬件支持。
然而,使用软件事务内存(它必须是软件实现,因为硬件支持仍然是非常实验性的)是微不足道的。
使用STM,您可以原子地执行任意内存操作,并让库担心确保线程安全。