可重入代码和局部变量

Cri*_*nSO 6 .net c# multithreading thread-safety

我有一个方法,如:

private static string AmpRemove(string str)
{
    int index = str.IndexOf('&');
    if (index > 0)
        str = str.Substring(0, index);
    return str;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我试图从字符串中获取文本,直到&找到字符.我的大四学生修改了这个方法

private static string AmpRemove(string str)
{
    if (str.IndexOf('&') > 0)
        str = str.Substring(0, str.IndexOf('&'));
    return str;
}
Run Code Online (Sandbox Code Playgroud)

所以不是存储它index,而是计算它两次,他的推理是因为该方法将在多个线程中调用,所以可能存储无效值index.

我的线程的理解是有限的,但我相信每个线程将有它自己的堆栈,其中参数strindex将被推动.我已经尝试过与他进行推理,这是一个可重入的代码,并且多线程无法修改此方法中的局部变量.

所以,我的问题是,我是否正确地假设缓存存储index是一个更好的解决方案,因为它不会涉及计算索引两次,因为它是局部变量并且str是方法的本地参数,所以多线程无法修改/更改strindex

那是对的吗 ?

Dav*_*vid 8

index 在给定代码的情况下无法修改,因为它是一个局部变量,并且从另一个线程调用的任何方法都是单独的调用,因此不共享局部变量.

但是,您不会控制string参数,因为它被传入.这将使其线程不安全...除了根据MSDN,string对象是不可变的.因此,您可以假设string您传递的内容在调用之间保持不变,并且是线程安全的.虽然重新分配的值str,参数不为过ref,因此,只有重新分配的局部指针,它并不会改变其在通过调用者的变量.

因此,如所示,第一代码是线程安全的.传入的类型或传入方式的任何更改都不能立即被假定为线程安全的.