dav0913 2013-07-31 08:35 采纳率: 0%
浏览 1043

C#版关于之前看到的睡眠排序

之前看别人的博客看到这个排序方法,就拿来试了下,
因为要给线程传递参数我先用了ParameterizedThreadStart传参数
结果是正确的。
后来我改用匿名函数,就不用特意为传参数单独写个结构或者类了,
但是问题是,现在我传进去一个整数数组,老报错说IndexOutOfRangeException
但是调试执行却没有错,不过结果不是我想要的。
为什么i的值会是9呢,我明明让i<sortThread.Length.
希望帮忙解答以下,谢谢。
以下是代码:

private void DoSort()
{
int[] ints = { 1, 4, 7, 3, 8, 9, 2, 6, 5 };

        Thread[] sortThreads = new Thread[ints.Length];
        for (int i = 0; i < sortThreads.Length; i++)
        {
            //sortThreads[i] = new Thread(new ParameterizedThreadStart(run));
            //sortThreads[i].Start(ints[i]);
            sortThreads[i] = new Thread(new ThreadStart(delegate { run(ints[i]); }));
            sortThreads[i].Start();

        }
    }


    private void run(int ms)
    {
        try
        {
            Thread.Sleep(ms * 1000 + 10);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.WriteLine(ms);
    }
  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-09 18:54
    关注

    这个问题是由于使用匿名函数导致的。


    当使用匿名函数时,匿名函数内部的变量会被多个线程共享,这就导致了在某些情况下出现问题。在你的代码中,每个线程都会执行匿名函数,并且在匿名函数内部使用了 i 变量,这就导致了每个线程都在使用同一个变量。当你使用匿名函数时,应该避免使用循环变量。


    为了解决这个问题,你可以使用下面的代码来修改你的程序:

    private void DoSort()
    {
        int[] ints = { 1, 4, 7, 3, 8, 9, 2, 6, 5 };
    
        Thread[] sortThreads = new Thread[ints.Length];
        for (int i = 0; i < sortThreads.Length; i++)
        {
            int index = i;
            sortThreads[i] = new Thread(new ThreadStart(delegate { run(ints[index]); }));
            sortThreads[i].Start();
        }
    }
    
    private void run(int ms)
    {
        try
        {
            Thread.Sleep(ms * 1000 + 10);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    
        Console.WriteLine(ms);
    }
    

    这样每个线程都会使用自己的变量,就不会出现问题了。


    另外,你的代码中的睡眠排序算法并不是一个正确的排序算法,因为它只是基于睡眠时间来排序数字的。如果你想要实现一个正确的排序算法,可以考虑使用其他算法,例如快速排序或归并排序。这些算法都是在内存中进行排序的,而不是像睡眠排序那样基于睡眠时间来排序。


    快速排序是一种分治算法,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按这种方式对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


    归并排序是一种把两个或两个以上的有序表合并成一个新的有序表的排序算法。归并排序是建立在归并操作上的一种有效的排序算法。归并排序的优势在于其时间复杂度为 O(nlogn),并且是一种稳定的排序算法。


    你可以根据你的需要选择适合的排序算法来实现排序功能。

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?