如何检查C++类型是否可以轻易复制?我有一个类,它使用具有指定模板类型T的memcpy和memcmp函数,我想为类型启动断言,使用memcpy复制是不安全的.有没有办法(使用现有标准)?
普通加载在x86上获得了语义,普通商店具有发布语义,但编译器仍然可以重新排序指令.虽然围栏和锁定指令(锁定的xchg,锁定的cmpxchg)会阻止硬件和编译器重新排序,但仍需要普通的加载和存储来保护编译器障碍.Visual C++提供了_ReadWriterBarrier()函数,它可以防止编译器重新排序,同样C++提供volatile关键字也是出于同样的原因.我写这些信息只是为了确保我把一切都弄好.所以上面写的都是真的,有没有理由将其标记为将在_ReadWriteBarrier()保护的函数中使用的volatile变量?
例如:
int load(int& var)
{
_ReadWriteBarrier();
T value = var;
_ReadWriteBarrier();
return value;
}
Run Code Online (Sandbox Code Playgroud)
使变量非易失性是否安全?据我所知,因为函数受到保护,内部编译器无法进行重新排序.另一方面,Visual C++为volatile变量提供了特殊的行为(不同于标准的变量),它使得volatile可以读写原子加载和存储,但是我的目标是x86,而且x86上的普通加载和存储应该是原子的无论如何,对吗?
提前致谢.
我对x86上的顺序一致的加载操作感兴趣.据我所知,汇编程序列表由编译器生成,它在x86上实现为普通加载,但据我所知,普通加载有保证获得语义,而普通商店保证有释放.顺序一致的存储实现为锁定的xchg,而加载为普通负载.这听起来很奇怪,你能详细解释一下吗?
添加
刚刚在互联网上找到,顺序一致的原子载荷可以作为简单的mov完成,只要存储是用锁定的xchg完成的,但是没有证据也没有文档链接.你知道我在哪里可以读到这个吗?
提前致谢.
我在InitOnceExecuteOnce WinAPI函数上有一个异常安全问题.每当从回调函数抛出异常时,就会发生死锁.回调返回boolean标志告诉调用者数据是否成功初始化,但是如果我返回false,我将无法重新抛出异常,这不好.我尝试过这样解决问题.
try
{
InitOnceExecuteOnce(&flag, init_once_handler, &arguments, 0);
} catch (...)
{
InitOnceInitialize(&flag);
throw;
}
Run Code Online (Sandbox Code Playgroud)
每当我从函数中捕获异常时,我再次初始化结构并重新抛出异常,因此其他线程将发现数据未初始化,因为标志处于初始状态.但是,它有时也会死锁,可能是因为其他线程在第一个捕获异常并再次初始化标志之前开始等待同步对象.这个问题有什么解决方案吗?
提前致谢.
c++ ×3
atomic ×2
visual-c++ ×2
assembly ×1
load ×1
memcmp ×1
memcpy ×1
type-traits ×1
volatile ×1
winapi ×1