Интересно, если этот код нормально или нет:Правильно ли этот код правильно синхронизирован?
#include <iostream>
#include <future>
struct Foo
{
Foo()
:m_a(0)
{
}
int m_a;
};
int main()
{
Foo f;
auto handle =
std::async(std::launch::async,
[](Foo* f) { std::cout << f->m_a << '\n'; } ,
&f
);
handle.get();
}
Я считаю, что m_a
должен быть защищен с помощью механизма синхронизации, но мой коллега говорит, что это не нужно.
EDIT: Для того, чтобы прояснить мой вопрос: Я обеспокоен тем, что операция STORE из конструктора Foo()
происходит после операции загрузки из другого потока. Я не вижу, какой механизм мешает компилятору выполнить эту инструкцию в этом порядке.
EDIT: Я считаю, что с энтузиазмом компилятор мог бы решить встраивать конструктор, и задержать операцию STORE для после операции ВЫЗОВА к std::async
. В этом случае второй поток мог бы получить доступ к m_a
, прежде чем он будет передан в память.
Ничто другое не пишет в 'f' или не читает его в' main', поэтому синхронизация не синхронизируется. Но это поможет, если вы перечислите некоторые аргументы с каждой стороны. – juanchopanza
@juanchopanza В 'f' есть что-то другое: оно разрушается автоматически, то есть доступ к' f-> m_a' лучше не произойдет после уничтожения 'f'. –
@FrerichRaabe Он уничтожается после вызова 'handle.get()'. Поэтому я имел в виду, что в 'main()' read-write нет, пока выполняется асинхронная операция. Теперь это было небезопасно, 'std :: async' было бы чертовски бесполезно. – juanchopanza