C# 多线程程序逻辑
我的教授给了我这个半伪代码。他说我应该在这个代码的逻辑中找到一个错误。目前我什么也找不到,可能是什么问题。你能不能给我一些提示,告诉我可能出了什么问题?我不是在问答案,因为我想自己找到答案,但一些我应该朝哪个方向看的提示会很棒C# 多线程程序逻辑,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我的教授给了我这个半伪代码。他说我应该在这个代码的逻辑中找到一个错误。目前我什么也找不到,可能是什么问题。你能不能给我一些提示,告诉我可能出了什么问题?我不是在问答案,因为我想自己找到答案,但一些我应该朝哪个方向看的提示会很棒 class Program { int progressValue = 0; int totalFiles = 0; int i = 0; bool toContinue = true; void MasterThread() {
class Program
{
int progressValue = 0;
int totalFiles = 0;
int i = 0;
bool toContinue = true;
void MasterThread()
{
Thread thread1 = new Thread(Worker1);
Thread thread2 = new Thread(Worker2);
Thread progressThread = new Thread(ProgressThread);
thread1.Start();
thread2.Start();
progressThread.Start();
}
void Worker1()
{
string[] files = Directory.GetFiles(@"C:\test1");
totalFiles += files.Length;
foreach (string file in files)
{
Encryption.Encrypt(file);
i++;
progressValue = 100 * i / totalFiles;
}
toContinue = false;
}
void Worker2()
{
string[] files = Directory.GetFiles(@"C:\test2");
totalFiles += files.Length;
foreach (string file in files)
{
Encryption.Encrypt(file);
i++;
progressValue = 100 * i / totalFiles;
}
toContinue = false;
}
void ProgressThread()
{
while (toContinue == true)
{
Update(progressValue);
Thread.Sleep(500);
}
}
}
有几个,;我将列举两个明显的例子,我想这不是如何编写精确和正确的多线程代码的练习 你应该问自己以下问题:
progressValue
应该测量总工作量的0到100之间的进度(进度值等于150似乎有点不合适,不是吗?)。真的是这样吗progressValue
(Update(progressValue)
)。你真的这么做了吗我对多线程不太了解,但我会尝试给出一些提示。 首先看看全局变量,当您在不同线程中访问同一个变量时会发生什么 除了另一个答案上的提示之外,我找不到任何其他“错误” 这是在第一个完成线程的末尾设置的-这将导致ProgressThread在第一个线程完成后立即停止,而不是在两个线程都完成时停止。应该有两个单独的线程完成标志,并且两个都应该被检查。为了补充已经提供的好答案,我有点透彻了,但我的想法是学习 异常处理 可能是异常处理的问题。始终检查程序中可能出现意外结果的位置。
如果此变量的值不是我们期望的值,那么此代码将如何运行?
如果我们除以零会发生什么?
诸如此类的事情 看看在哪里初始化变量,问问你自己,这是否有可能不会按照预期的方式初始化 方法调用 还可以查看代码中使用的所有库。e、 g.加密。
问问你自己,这些陈述会给我一个预期的结果吗? e、 g 这会返回字符串数组吗?
这就是初始化字符串数组的方式吗 电话质询: e、 g 这到底有什么用 线程化 这样调用三个线程将如何工作。
它们需要协调吗?
线程是否应该休眠以允许其他操作完成 也可用于从不同线程访问变量。
试图跟踪该变量的值是否会出现混乱?
它们是否被覆盖
命名约定 在一个较小的注释中,C#中的命名约定存在问题。在C#中,使用泛型
var
的隐式类型比显式类型声明更可取
我并不是说所有这些观点都有问题,但如果您调查所有这些观点以及其他答案中的观点,您将发现所有错误,并更好地理解您正在阅读的代码。以下是项目:
主线程
”上没有任何内容,因此很难判断程序是否会立即结束totalFiles
,如果两个线程同时访问,则其中一个线程或另一个线程可能会获胜(或者两个线程都可能部分更新该值),因此无法判断您是否拥有有效值<代码>联锁.Add(参考totalFiles,files.Length)应改为使用代码>i
,这也可能会损坏<代码>联锁增量(参考i)应改为使用代码>加密。Encrypt
是否是线程安全的。可能应该使用锁
ProgressThread
中的循环是坏的-Thread。应始终避免睡眠
——最好使用显式更新调用(或其他机制)来更新进度是否更新(progressValue)代码>是线程安全的。可能应该使用锁
谢谢你强调这两个问题,我将研究它们。实际上,这个主题被称为多线程编程,所以它可能是多线程部分逻辑中的一些错误。您能看到任何?对变量的并发访问吗?感谢所有人的回答以及您花在回答和尝试帮助我上的时间!我一定会调查你指出的所有事情!谢谢
toContinue = false;
string[] files = Directory.GetFiles(@"C:\test1");
Update(progressValue);