【问题标题】:Multiple threads calling the same function doesn't work多个线程调用同一个函数不起作用
【发布时间】:2014-12-22 19:04:51
【问题描述】:

我有这段代码,并且有一个名为 STARTWORK(int THREADNR) 的函数,它不能被 2 个线程调用。基本上我的程序的所有工作都包含在这个函数中,在 WORKVOID1() 和 WORKVOID2() 中,我使用单独的 for() 函数来遍历数据,而 for() 函数被分成两半,这样 2函数覆盖了一半的数据,速度更快,并且在多核处理器上工作。问题是,如果只有主线程,它就像一个魅力,但如果我尝试将 STARTWORK() 分成两部分WORKVOID1() 和 WORKVOID2() 在多个线程中都不起作用,所以请帮我解决它。

  public void OPTIMIZATION_ITERATION()
    {
           Thread WORK = new Thread(WORKVOID);
                WORK.Name = "T1";
                WORK.Start();
           Thread WORK2 = new Thread(WORKVOID2);
               WORK2.Name = "T2";
                WORK2.Start();
    }
            public void WORKVOID()
            {
                for (ALPHA = 0.001; ALPHA <= 0.5; ALPHA += 0.001)
                STARTWORK(1);
            }
            public void WORKVOID2()
            {
                for (ALPHA = 0.5; ALPHA <= 1; ALPHA += 0.001)
                STARTWORK(2);
            }

  public void STARTWORK(int THREAD)
{
//.......bunch of calculations then it writes it to file
    System.IO.StreamWriter WRITE = new System.IO.StreamWriter("OUTPUT_T"+THREAD+".txt", true);
    WRITE.BaseStream.Seek(0, SeekOrigin.End);
   WRITE.WriteLine(/*..calculations are written to file..*/);
    WRITE.Close();
    WRITE.Dispose();
}

STARTWORK(int THREADNR) 包含一个参数,该参数将分配一个将数据写入文件的数字,以便 2 具有不同的文件名,而 ALPHA 是一个全局双变量。

【问题讨论】:

  • 您知道 TPL Paralell.For 吗?我不确定您要实现什么目标,有什么问题等。另外,您的 请快帮我! 并不能真正帮助您。
  • 不,我不是,你能解释一下如何使用它吗?
  • 请阅读一些tutorialsthis,尝试使用它。打到就回来。我们很乐意提供帮助。目前,如果不知道您想要实现什么,我就帮不上什么忙了。
  • 我已经向@Blaatz0r 请求添加了更多代码,希望现在更清楚,如果您希望对新代码分享任何评论,我将不胜感激。
  • 基于上次编辑,请参阅this 关于StreamWriter 和多线程的答案。

标签: c# multithreading function error-handling functional-programming


【解决方案1】:

如果你在 c# 中工作,你可能想试试这个。

 public void OPTIMIZATION_ITERATION()
{
       Thread WORK = new Thread(new ThreadStart(WORKVOID));
            WORK.Name = "T1";
            WORK.Start();
       Thread WORK2 = new Thread(new ThreadStart(WORKVOID2));
           WORK2.Name = "T2";
            WORK2.Start();
}
        public void WORKVOID()
        {
            for (ALPHA = 0.001; ALPHA <= 0.5; ALPHA += 0.001)
            STARTWORK(1);
        }
        public void WORKVOID2()
        {
            for (ALPHA = 0.5; ALPHA <= 1; ALPHA += 0.001)
            STARTWORK(2);
        }

【讨论】:

  • 除了创建冗余委托之外,您还做了哪些更改?
  • 线程启动的事实。下次先写你的评论,等待答案,然后写下帖子。这是常识。
  • 对不起不起作用,STARTWORK(int THREADNR) 使用的文件是空的,它几乎就像 STARTWORK 使用的所有变量都同时使用而没有备份,我认为多个线程使所有全局变量local在一个备份中,他们不是为了逃避这个冲突吗?
  • @Blaatz0r 我不是投反对票的人,但您的代码有什么不同?对我来说,它看起来像是一个复制和粘贴工作!你在你的帖子中说“如果你在 c# 中工作,你可能想试试这个”。我们知道它是 C# 有两个原因,1) 我们查看了标签,2) 我们可以看到它是 c#.......
  • @MoPatel,我看到了您关于复制粘贴操作的评论,但如果您更仔细地查看 OP 的编辑帖子,您会发现他复制了 Blaatz0r 的答案。
【解决方案2】:

我认为问题在于 ALPHA。一旦启动第二个线程,就将其设置为等于第一个线程正在寻找的条件(ALPHA

除此之外,我真的看不出尝试并行执行此操作的意义,如果您要写入同一个磁盘,那将无济于事。如果您正在执行的计算是 CPU 密集型的,那么将计算并行化,然后在完成后将所有内容写入磁盘,或者如果内存存在问题,则以块的形式写入磁盘可能是一种更好的方法。

【讨论】:

    【解决方案3】:

    ALPHA 等全局变量不能在多线程上下文中安全使用。这是因为两个线程都被允许在完全相同的时间读/写,这会导致竞争条件。我建议您更改工作方法以接受double 参数。这样,每个方法都将使用局部变量而不是全局共享变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多