Использование атомарных типов в классах-оболочках - PullRequest
1 голос
/ 10 июня 2019

Я новичок в атомарных типах C ++ и пытаюсь преобразовать некоторый последовательный код в многопоточную версию.

1) У меня есть несколько классов, которые в основном являются псевдонимами для типов машин, но со связанными функциями и перегруженными операторами, которые позволяют мне обрабатывать эти типы, как будто они являются чем-то более сложным, например:

class myClass{
    atomic_ullong x;
public:
    void myClassFunc(atomic_ullong mask){x &= mask;}
    bool operator < (const myClass &in){ return (x & 0xFFFFFFFFFFFFFC00) <  (in.x & 0xFFFFFFFFFFFFFC00);}
};

Достаточно ли будет простого объявления членов класса и параметров функции в качестве их атомарных эквивалентов типа, как я уже говорил выше?Или заставит меня обернуть x как «myClass», чтобы начать использовать мьютексы и тому подобное?

2) Если это работает, в некоторых случаях у меня есть более сложный код с более чем одним членом класса.В этих случаях, если все эти члены являются базовыми типами машин (целочисленными и т. Д.), Могу ли я сделать тот же трюк и сохранить все преимущества атомарных типов?

Конечно, я могу реструктурировать свой код здесь, ноявные классы делают это намного проще и не позволяют мне случайно что-то делать с элементами хранимых данных, что мне не следует.

Не то чтобы это важно, но я делаю отладочную компиляцию в Visual Studio 2008 и производственную компиляцию вGCC.Я загружаю VC2019, поскольку мы говорим о поддержке C ++ 11 и выше.Ранее я использовал библиотеки Boost для многопоточных приложений.

1 Ответ

2 голосов
/ 10 июня 2019

Если вы читаете, то пишите, это не атомарно с наивными операциями.

Если вы записываете в два атомарных значения, две записи вместе не являются атомарными.

Как правило, сбор данных и превращение каждого базового типа в атомарный не сделает ваш код корректным после его многопоточности. Он устраняет условия гонки (в формальном смысле C ++, то есть UB), но не исправляет ситуацию.

Это похоже на решение проблемы использования после освобождения, когда все становится общим. Конечно, одна проблема исчезнет, ​​но это была не самая сложная часть.

Ничто в классе не делает атомного разрушения. Они работают; они не решают все проблемы с потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...