调用相同函数的多个线程不起作用

时间:2014-10-27 14:52:57

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

我有这个代码,并且有一个名为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是全局双变量。

3 个答案:

答案 0 :(得分:0)

如果你在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);
        }

答案 1 :(得分:0)

我认为问题是ALPHA。一旦启动第二个线程,您将其设置为等于第一个线程正在查找的条件(ALPHA&lt; = .5),然后第一个线程将ALPHA增加.001。最终结果是第一个线程极不可能向文件写入任何内容(可能是一行,具体取决于时间)。

除此之外,我并没有真正看到尝试并行执行此操作的重点,如果您正在写同一个磁盘,它将无助于任何帮助。如果您正在进行的计算是CPU密集型,那么可能是一种更好的方法来使计算并行,然后在完成后将所有内容写入磁盘,或者如果内存是一个问题则将其写入块中。

答案 2 :(得分:0)

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