字符串的“InterlockedExchange”

时间:2011-01-12 10:41:32

标签: c++ mutex

我需要InterlockedExchange的等价物,我可以用它来为字符串分配字符串。 这个等价物应该可以在c ++中使用。我知道我可以开始实现我自己的基于互斥锁的解决方案,但是想知道是否有任何准备和优雅的东西。

谢谢。

4 个答案:

答案 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,您可以原子地执行任意内存操作,并让库担心确保线程安全。