误解线程如何工作

时间:2015-04-01 09:45:12

标签: vb.net multithreading threadpool

我遇到问题,vb.net

中的主题存在很大问题

首先,我想告诉我之前(仅在学校)我没有使用过线程,我阅读了很多关于它的网页,但是没有一个能帮我解决问题。

我的主要问题是理解逻辑,如果可能的话,解决我所拥有的问题,两者都是相关的,那么我将解释这个问题。

代码没有相关的评论和/或文档,并且是很多年前开发的程序,这样做的人不在办公室工作,没有人知道它是如何工作的:S

我有一个名为listOfProccess的列表,何时只有1可以正常工作。

QueueUserWorkItem的回调函数中填写有关p的信息,然后执行该线程,我想

该列表包含信息类型为

的数组
listOfProccess[].type = 'a/b/c/d/e/f/g/'

该列表还包含一个ID。

代码:

If listOfProccess.Count > 0 Then

    Threading.ThreadPool.SetMinThreads(1, 1)

    Threading.ThreadPool.SetMaxThreads(4, 4)


    For Each p In listOfProccess
        Try

            Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(Object p.function))


        Catch e As Exception
            sendMail("mail@mail", "alerts@mail.ie", "", e.StackTrace)
        End Try
    Next

问题: 我有两个问题:

  1. 有时候会在列表中执行一项,即' a'在一个无限循环,并消耗机器的所有资源,但如果我关闭并重新启动,工作,我不知道是否是线程的问题,真诚地我认为这是另一回事,因为这问题从两周或一周前开始,程序仍然在一年内运行。

  2. 我认为这个与线程有关,如果我在列表中有两个(或更多)p,就像这样:

    p[1].type = 'a/b/c/d/e/f/g/' p[1].ID = 1

    p[2].type = 'ww/xx/ff/yy/aa/rr/' p[2].ID =2

  3. 当系统执行类似这样的操作时,它遵循的方式是随机的'即。取第一个,a, b,c,然后它ww,然后回到第一个。如果列表中有更多项目,例如4或5,问题就更大了;这不是一个非常大的问题,因为程序有效,它不能100%正常工作,但是工作,更多的是尝试理解它为什么会这样工作。

    欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

第二个问题是race condition问题,因为您无法保证线程执行的顺序,您的线程将替换彼此的值的概率非零。有很多方法可以解决这个问题:algorythms(面向锁定和无锁),同步技术等等,并且没有silver-bullet解决方案。

第一个问题对我来说不清楚,因为我无法理解a infinite loop究竟是什么意思 - 如果将项目链接到已删除(来自其他线程)并且没有办法可能会发生这种情况离开你的任务,因为列表中的链接被破坏了。这仍然应该通过同步来解决。

我认为你应该从一般的MSDN文章或一些关于多线程的书开始,之后你应该逐步拆分你理解的小部分程序。

更新

p.function - 关于无限循环,你应该考虑这个委托的代码。如果有重新启动工作的条件,则应检查递归限制。例如,如果有an optimistic locking algorythm,您的代码可以发现它尝试的更新无效,并且重新启动它。如果链接被破坏,它将永远不会结束它的任务,并将永远处于无限循环中。