我有这个代码,并且有一个名为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是全局双变量。
答案 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
参数。这样,每个方法都将使用局部变量而不是全局共享变量。