请考虑以下代码:
struct payload
{
std::atomic< int > value;
};
std::atomic< payload* > pointer( nullptr );
void thread_a()
{
payload* p = new payload();
p->value.store( 10, std::memory_order_relaxed );
std::atomic_thread_fence( std::memory_order_release );
pointer.store( p, std::memory_order_relaxed );
}
void thread_b()
{
payload* p = pointer.load( std::memory_order_consume );
if ( p )
{
printf( "%d\n", p->value.load( std::memory_order_relaxed ) );
}
}
Run Code Online (Sandbox Code Playgroud)
C++是否对线程a中的fence与线程b中的consume操作的交互做出了任何保证?
我知道在这个例子中我可以用商店版本替换fence + atomic存储并让它工作.但我的问题是关于使用栅栏的这种特殊情况.
阅读标准文本我可以找到关于释放围栏与获取围栏的交互以及具有获取操作的释放围栏的交互的条款,但没有关于释放围栏和消费操作的交互的内容.
我认为,用一个获取取代消费将使代码符合标准.但据我了解处理器实现的内存排序约束,我应该只需要线程b中较弱的"消耗"排序,因为内存屏障强制线程a中的所有存储在存储到指针之前可见,并且读取有效负载取决于从指针读取.
标准是否同意?
我的问题是这个.我有一块数据.有时会更新此数据块并显示新的更改版本.我需要检测我正在查看的数据是否与我期望收到的版本相匹配.
我决定使用指纹,以便我可以避免完整地存储"预期"版本的数据.似乎这种事情的'默认'选择是MD5哈希.
但MD5的设计是加密安全的.散列函数有更快的速度.我正在寻找现代的非加密函数,如CityHash和SpookyHash.
由于我控制系统中的所有数据,我只关心意外碰撞,其中更改的数据块散列到相同的值.因此,我认为我不必担心加密哈希的"攻击者证明"性质,并且可以使用更简单的哈希函数.
使用诸如CityHash或SpookyHash之类的哈希函数是否存在任何问题,或者我应该坚持使用MD5?或者我应该使用专门用于指纹识别的东西,如拉宾指纹?