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 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)