У меня есть параллельный объект, который может или может содержать указатель на функцию каждый раз. Схема объекта выглядит так:
struct ConcurrentObject{
//variables
std::atomic<void(*)()> callback;
}
поэтому один поток может решить, что он хочет присоединить обратный вызов к этому объекту и передать его дальше:
ConcurrentObject* co = new ConcurrentObject(); //I'm using smart pointers, no worries.
//do some logic
co->callback = someCallback; //void(*)() , this may be difference callback every time
Я получаю этот объект после его модификации и проверяю, доступен ли обратный вызов:
auto co = aquireConcurrentObject();
auto callback = co->callback.load();
if (callback){
callback()
}
теперь мы знаем, что без указания какого-либо порядка памяти по умолчанию передается память в порядке memory_order_seq_cst
, что говорит компилятору (в двух словах) «не путайте никакие инструкции чтения или записи, чтобы сделать программу быстрее, сохраняйте относительный порядок инструкций, как указано код и сделать его видимым через процессор».
мы также знаем, что это большое препятствие для производительности, поскольку компилятор гораздо более ограничен действиями, которые он может предпринять.
Мой вопрос - достаточно ли std::memory_order_relaxed
для этого действия?