当前位置: 首页>>编程语言>>正文


std :: atomic<std :: string>适当地工作?

斯里兰卡 编程语言 , , , 去评论

问题描述

我正在阅读安东尼·威廉姆斯的“C++并发行动”,第5章介绍了新的multithreading-aware内存模型和原子操作,他说:

In order to use std::atomic<UDT> for some user-defined UDT, this type must have a trivial copy assignment operator.

据了解,这意味着如果以下返回true,我们可以使用std::atomic<UDT>

std::is_trivially_copyable<UDT>::value

根据这个逻辑,我们不能使用std::string作为std::atomic的模板参数,并且它的工作正常。

但是,以下代码使用预期输出进行编译和运行:

#include <atomic>
#include <thread>
#include <iostream>
#include <string>

int main()
{
    std::atomic<std::string> atomicString;

    atomicString.store( "TestString1" );

    std::cout << atomicString.load() << std::endl;

    atomicString.store( "TestString2" );

    std::cout << atomicString.load() << std::endl;

    return 0;
}

这是一个未定义的行为,恰恰恰好像预期的那样行事吗?

提前致谢!

最佳解决方法

该标准没有指定std::atomic<std::string>的专业化,因此通用的template <typename T> std::atomic<T>适用。 29.5 [atomics.types.generic] p1状态:

There is a generic class template atomic. The type of the template argument T shall be trivially copyable (3.9).

没有声明实施必须诊断违反此要求的行为。因此,(a)您使用std::atomic<std::string>调用未定义的行为,或(b)您的实现提供了std::atomic<std::string>作为一致的扩展。

看看std::atomic<T>(http://msdn.microsoft.com/en-us/library/vstudio/hh874651.aspx)的MSDN页面,它明确提到了T是简单可复制的要求,并没有对std::atomic<std::string>做任何具体说明。如果它是一个扩展名,它是无证的。我的钱是未定义的行为。

具体来说,17.6.4.8/1适用(with thanks to Daniel Krügler for setting me straight):

In certain cases (replacement functions, handler functions, operations on types used to instantiate standard library template components), the C++ standard library depends on components supplied by a C++ program. If these components do not meet their requirements, the Standard places no requirements on the implementation.

std::string当然不符合std::atomic<T>的要求,即模板参数T简单可复制,因此标准对实施没有要求。作为执行质量问题,请注意,static_assert(std::is_trivially_copyable<T>::value, "std::atomic<T> requires T to be trivially copyable");是一种容易诊断的方法来抓住这种违规行为。


2016-04-19更新:我不知道发生什么变化,但VS2015 Update 2现在诊断std::atomic<std::string>

error C2338: atomic requires T to be trivially copyable.

次佳解决方法

不,这是未定义的行为。此外,由于std :: string不是简单的可复制的,所以一致的编译器应该发出“至少一个诊断消息”:

29.5 Atomic types

There is a generic class template atomic. The type of the template argument T shall be trivially copyable (3.9).

1.4 Implementation compliance

— If a program contains a violation of any diagnosable rule […] a conforming implementation shall issue at least one diagnostic message.

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/173640.html,未经允许,请勿转载。
Go