[Bug c++/80857] slow compare_exchange_weak with unintegral type
sv_91 at inbox dot ru
gcc-bugzilla@gcc.gnu.org
Fri May 26 08:50:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80857
--- Comment #1 from sv_91 at inbox dot ru ---
A simpler example for demonstrates the problem
struct MyStruct {
int64_t value;
};
inline MyStruct operator+(const MyStruct &first, const MyStruct &second) {
return MyStruct{first.value + second.value};
}
template<typename T>
inline void atomic_fetch_add(std::atomic<T> &obj, const T& arg) noexcept {
T current = obj;
while (!obj.compare_exchange_weak(current, current + arg));
}
void func1(int n) {
const time_point beginTime(::now());
std::atomic<int64_t> a1(0);
for (int i = 0; i < n; i++) {
atomic_fetch_add(a1, (int64_t)i);
}
const time_point endTime(::now());
std::cout << "Result " << a1.load() << ". Time " <<
std::chrono::duration_cast<milliseconds>(endTime - beginTime).count() <<
std::endl;
}
void func3(int n) {
std::cout << std::is_pod<MyStruct>::value << std::endl;
const time_point beginTime(::now());
std::atomic<MyStruct> a1(MyStruct{0});
for (int i = 0; i < n; i++) {
atomic_fetch_add(a1, MyStruct{i});
}
const time_point endTime(::now());
std::cout << "Result " << a1.load().value << ". Time " <<
std::chrono::duration_cast<milliseconds>(endTime - beginTime).count() <<
std::endl;
}
Output:
Result 49999995000000. Time 101
1
Result 49999995000000. Time 158
More information about the Gcc-bugs
mailing list