Модель упорядочения памяти x86 обеспечивает барьеры #StoreStore и #LoadStore для всех инструкций хранилища 1 sup>, что является всей необходимой семантикой выпуска. Также процессор выполнит инструкцию сохранения как можно скорее; когда инструкция сохранения удаляется, хранилище становится самым старым в буфере хранения, ядро имеет целевую строку кэша в состоянии когерентности с возможностью записи, и порт кэша доступен для выполнения операции сохранения 2 sup>. Таким образом, нет необходимости в инструкции MFENCE
. Флаг станет видимым для другого потока как можно скорее, и когда он это сделает, any_value
гарантированно будет 10.
С другой стороны, последовательная согласованность также требует барьеров #StoreLoad и #LoadLoad. MFENCE
требуется предоставить оба барьера 3 sup>, поэтому он используется на всех уровнях оптимизации.
Похожие: Размер буферов хранилища на оборудовании Intel? Что именно является буфером хранилища? .
Сноски:
(1) Существуют исключения, которые здесь не применяются. В частности, временные хранилища и хранилища в не кэшируемых типах памяти, сочетающих запись, обеспечивают только барьер #LoadStore. В любом случае, эти барьеры предусмотрены для магазинов с типом памяти с обратной записью на процессорах Intel и AMD.
(2) Это в отличие от хранилищ, сочетающих запись, которые сделаны глобально видимыми при определенных условиях. См. Раздел 11.3.1 руководства Intel, том 3.
(3) См. Обсуждение под ответом Петра.
Вы можете добавить обработчик события в ItemContainerStyle
(это стиль, применяемый к ряду) :
<DataGrid ... >
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
</Style>
</DataGrid.ItemContainerStyle>
...
</DataGrid>
Затем, в обработчике, вы можете проверить, выбран ли ряд
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
// execute some code
}
С привязкой данных и MVVM Вы сделали бы событие с одним щелчком (=selectedItem строки) как это:
<Datagrid ItemsSource="{Binding YourObservableCollectionProperty}"
SelectedItem="{Binding YourSelectedItemProperty}">
//more...
</Datagrid>
CodeBehind:
public partial class YourClass : Window
{
public YourClass()
{
InitializeComponent();
this.DataContext = new YourClassViewModel();
}
}
ViewModel:
public class YourClassViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private ObservableCollection<YourModelClass> _yourObservableCollectionProperty;
public ObservableCollection<YourModelClass> YourObservableCollectionProperty
{
get { return _yourObservableCollectionProperty; }
set
{
_yourObservableCollectionProperty = value;
OnPropertyChanged("YourObservableCollectionProperty");
}
}
private YourModelClass _yourSelectedItemProperty;
public YourModelClass YourSelectedItemProperty
{
get { return _yourSelectedItemProperty; }
set
{
_yourSelectedItemProperty = value;
OnPropertyChanged("YourSelectedItemProperty");
}
}
//Constructor
public YourClassViewModel()
{
/*Take your ModelClass instance and ObservableCollection instance here
and play around with them or move them into a method. Normally your
observablecollection is the itemssource of your datagrid and your selecteditem
is your modelclass.*/
}
}
Почему бы вам не получить свойство SelectedRow во время события DoubleClick и не сделать с ним что-нибудь? Если SelectedRow равно null, это означает, что ни один ряд не выбран, поэтому просто верните его
private void Grid_DoubleClick(object sender, RoutedEventArgs e)
{
if(grid.SelectedRow == null)
return; // return if there's no row selected
// do something with the Selected row here
}