, 그는 말한다 : 대한 std::atomic<UDT>
를 사용하려면std :: atomic <std::string>이 적절하게 작동합니까?
일부 사용자 정의
UDT
의 경우이 유형은 번자 복사 할당 연산자가 있어야합니다.std::is_trivially_copyable<UDT>::value
이 논리에 의해, 우리는
std::atomic
에 대한 템플릿 인수로std::string
을 사용할 수 없게한다 : 나는 그것을 알고있는 것처럼
,이 사실 다음 반환하는 경우 우리가 std::atomic<UDT>
를 사용할 수 있다는 것을 의미한다 제대로 작동하도록하십시오.
그러나, 다음 코드는 컴파일 및 예상 출력을 실행합니다
#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;
}
이 그냥 예상대로 작동하는 일이 정의되지 않은 동작의 경우인가?
미리 감사드립니다.
컴파일러 (및 stdlib 구현)는 무엇입니까? 나는 그것을 컴파일러 [여기] (http://coliru.stacked-crooked.com/view?id=0ce3b66093e9a0a59d5179429373eea7-e54ee7a04e4b807da0930236d4cc94dc)로 만들 수 없었고, 실제로 그것이 내가 기대하고 있었던 것이다. –
@AndyProwl 나는 VS 2012를 사용하고있다. 11 월 CTP없이. –
당신이 그것을 사용함에 따라, 나는 문제를 기대하지 않을 것입니다. 두 개 이상의 스레드가 같은 문자열을 동시에 수정하려고 할 때 문제가 발생합니다. 그 시점에서'string'의 중요한 연산자는 문제를 일으키기 시작할 것입니다. 'std :: atomic'에서 무언가를 래핑하는 것만으로도 코드 없이는 괜찮은 코드를 깨뜨리지 않을 것입니다. 동시에 규칙을 따르지 않아도 코드가 없으면 깨지는 코드는 도움이되지 않습니다. –