VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2108|回复: 23

问线程的奇怪问题

[复制链接]

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-14 17:40:01 | 显示全部楼层 |阅读模式
lngNowNumber= 0
        thr1(0) = New Thread(AddressOf thr0)
        thr1(0).Start()
        lngNowNumber+= 1
        thr1(1) = New Thread(AddressOf thr1)
        thr1(1).Start()
        lngNowNumber+= 1
        thr1(2) = New Thread(AddressOf thr2)
        thr1(2).Start()
        lngNowNumber+= 1
        thr1(3) = New Thread(AddressOf thr3)
        thr1(3).Start()
        lngNowNumber+= 1
        thr1(4) = New Thread(AddressOf thr4)
        thr1(4).Start()
        lngNowNumber+= 1
        thr1(5) = New Thread(AddressOf thr5)
        thr1(5).Start()
        lngNowNumber+= 1
        thr1(6) = New Thread(AddressOf thr6)
        thr1(6).Start()
        lngNowNumber+= 1
        thr1(7) = New Thread(AddressOf thr7)
        thr1(7).Start()
线程主要变量的操作(所有线程内容一致):
sub thr0
do while lngnownumber<1000
       SyncLock Me
           lngNowNumber += 1
           debug.print(lngNowNumber)
       End SyncLock
       '以下省略N行数据处理语句,较费时
loop
end sub
共有8个线程,对公共变量lngNowNumber进行处理

输出结果:
线程6:  15
线程4:  17
线程0:  18
线程2:  19
线程5:  20
线程3:  21
线程1:  22
线程0:  23
线程2:  24
线程6:  25
线程5:  26
线程1:  27
线程3:  28
线程4:  29
线程0:  30
线程5:  32
线程0:  33
线程1:  34
线程4:  35
线程2:  36
线程6:  37
线程5:  38
线程3:  39
线程4:  40
线程2:  41
线程3:  42
线程6:  43
线程1:  45
线程6:  47
线程4:  49
线程2:  50
线程0:  51
线程5:  52
线程3:  53
线程1:  54
线程0:  55
线程2:  56
线程6:  57
线程5:  58
线程1:  59
线程4:  60
线程3:  61
线程0:  63
线程0:  64
线程5:  65
线程4:  66
线程1:  67
线程6:  68
线程2:  69
线程3:  70
线程5:  71
线程2:  72
线程4:  73
线程6:  74
线程3:  75
线程1:  76
线程6:  78
线程4:  80
线程2:  82
线程0:  83
线程5:  84
线程3:  85
线程1:  86
线程0:  87
线程2:  88
线程6:  89
线程5:  90
线程1:  91
线程4:  92
线程3:  93
线程0:  95
线程0:  96
线程5:  97
线程1:  98
线程4:  99
线程2:  100
线程6:  101
线程3:  102
线程5:  103
线程4:  104
线程2:  105
线程3:  106
线程6:  107
线程1:  109
线程6:  111
线程4:  113
线程0:  114
线程2:  115
线程3:  116
线程5:  117
线程0:  118
线程1:  119
线程6:  120

问题:
1.线程7没执行(本身是和其他线程一起执行的),到最后才输出(其他线程执行完了才输出)
线程7:  1000
线程7:  1000
2.为什么有些lngNowNumber会被跳过?(注意上面输出的数字不是连续的,有跳空现象)
3.经测试
for i=0 to 8
    thr1(i) = New Thread(AddressOf thr1)
    thr1(i).Start()
next
执行结果不同于上面的分开addressof
    thr1(0) = New Thread(AddressOf thr0)
    thr1().Start()
这是为什么?
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-18 20:36:01 | 显示全部楼层
这就是多线程的特点,谁说先开始就先结束,要一起开始?

基本上是随机的。
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-1-19 11:00:02 | 显示全部楼层
没人要求要一起开始或一起结束啊...不要牛唔搭八
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-1-19 12:54:01 | 显示全部楼层
问题是线程8根本没执行,前面7个都正常,就是最后一个启动的线程要等到别的线程执行完了才执行,这其中恐怕有原因吧?
另外就是跳过了一些变量,这是为什么呢?
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-1-20 10:18:02 | 显示全部楼层
先作个记号,明天有空帮你看看..
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-1-22 20:36:01 | 显示全部楼层
以上1,3问题都解决了....剩下第二个问题...

详细找了msdn的同步资料
发现ReaderWriterLock 应该能保证变量的读写,可是看来看去没看明白这东西怎么用。。。。

怎么保证一个变量只有一个线程在读
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-23 16:00:01 | 显示全部楼层
我的想法:增加一个BOOL变量,相当于一个变量锁来用,当一个现成读取了变量之后,将BOOL变量设为TRUE,释放后状态还原,这样就能保证一个变量只有一个线程在读取了
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-23 17:45:01 | 显示全部楼层
lngNowNumber += 1
           debug.print(lngNowNumber)
在递增之后,debug输出之前,lngNowNumber 的值又被别的线程改变了,所以跳值。
回复

使用道具 举报

0

主题

23

帖子

20.00

积分

新手上路

Rank: 1

积分
20.00
发表于 2020-1-23 20:09:01 | 显示全部楼层
添加lock
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-24 03:09:01 | 显示全部楼层
做记
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表