我有一个特定方法bool Method(Myobject Obj)
,我想在ParallelFor()
循环中给他打电话。我真的能这样做吗?这是线程安全还是类似的东西?调用这样的方法感觉有点不对劲。
答案 0 :(得分:1)
线程安全始终根据上下文或特定情况决定。 让我们说,你有这个:
public static bool Even(int i)
{
return num % 2 == 0; //true: even, false: odd
}
public static void ThreadSafe()
{
bool[] arr = new bool[333];
Parallel.For(0, arr.Length, index =>
{
arr[index] = Even(index);
});
}
现在是线程安全吗?是。 数组的每个索引都为arr中的一个相关索引赋值。 因此,它可以并行完成。 但是现在呢?
public static void ThreadUnsafe()
{
bool[] arr = new bool[333];
Parallel.For(0, arr.Length, index =>
{
arr[index] = Even(index);
int index2 = (index + 1) < arr.Length ? (index + 1) : index;
arr[index2] = Even(index);
});
}
使用给定索引,我们可以在arr中分配两个索引,其他一些线程也可以写入它。它不是线程安全的,因为我们不知道,结果会是什么。
现在您可以看到,使用方法的上下文也可以确定其线程安全性。
此外,还有多种类型的线程安全性。