@ Поп Каталин: Я не согласен с тем, что ты сказал:
Если структура предназначена для обеспечения безопасности потоков, то методы должны быть сделаны экземплярами, только если они выполняют атомарные операции, в противном случае следует выбирать статические методы.
Вот небольшая программа, демонстрирующая, что статические методы не решают эту проблему для структур:
using System;
using System.Threading;
using System.Diagnostics;
namespace ThreadTest
{
class Program
{
struct SmallMatrix
{
double m_a, m_b, m_c, m_d;
public SmallMatrix(double x)
{
m_a = x;
m_b = x;
m_c = x;
m_d = x;
}
public static bool SameValueEverywhere(SmallMatrix m)
{
return (m.m_a == m.m_b)
&& (m.m_a == m.m_c)
&& (m.m_a == m.m_d);
}
}
static SmallMatrix s_smallMatrix;
static void Watcher()
{
while (true)
Debug.Assert(SmallMatrix.SameValueEverywhere(s_smallMatrix));
}
static void Main(string[] args)
{
(new Thread(Watcher)).Start();
while (true)
{
s_smallMatrix = new SmallMatrix(0);
s_smallMatrix = new SmallMatrix(1);
}
}
}
}
Обратите внимание, что такого поведения нельзя наблюдать с двойными значениями на общем процессоре, так как большинство инструкций x86 имеют версию, работающую с кусками 64 бита, такими как movl
.
Таким образом, безопасность потоков не является хорошей причиной для статичности IsNaN:
- Фреймворк должен быть независимым от платформы и поэтому не должен предполагать такие вещи, как архитектура процессора. Потокобезопасность IsNaN зависит от того факта, что 64-битные значения всегда доступны и изменяются атомарно на целевой архитектуре (А целевые платформы Compact не x86 ...).
- IsNaN сам по себе бесполезен, и в контексте, когда несколько потоков могут получить к нему доступ
someVar
этот код в любом случае небезопасен (независимо от безопасности потока IsNaN):
print("code sample");
if (!double.IsNaN(someVar))
Console.WriteLine(someVar);
Я имею в виду, что даже если IsNaN реализован путем ==
сравнения со всеми возможными значениями NaN ... (на самом деле это невозможно)
... кому важно, чтобы значение эволюционировало во время выполнения метода, если в любом случае оно могло бы измениться после завершения метода ... или это могло быть даже промежуточное значение, которого никогда не должно было быть здесь, если целевая архитектура не x86 ...
Доступ к интристическим значениям в двух разных потоках НЕ в целом безопасен, поэтому я не вижу интереса в обеспечении некоторой иллюзии безопасности, применяя какой-либо статический метод при работе со структурами или любым другим типом,