VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
123
返回列表 发新帖
楼主: irwin8888

问线程的奇怪问题

[复制链接]

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-21 09:45:01 | 显示全部楼层
输出:
thread0:1
thread6:2
thread6:3
thread6:4
thread6:5
thread6:6
thread6:7
thread6:8
thread6:9
thread1:10
thread1:11
thread0:12
thread2:13
thread2:14
thread3:15
thread4:16
thread4:17
thread4:18
thread5:19
thread5:20
thread5:21
thread0:22
thread1:23
thread2:24
thread3:25
thread4:26
thread0:27
thread1:28
thread2:29
thread0:30
thread1:31
thread2:32
thread0:33
thread1:34
thread2:35
thread0:36
thread1:37
thread2:38
thread0:39
thread1:40
thread2:41
thread0:42
thread1:43
thread2:44
thread0:45
thread1:46
thread2:47
thread0:48
thread1:49
thread2:50
thread0:51
thread1:52
thread2:53
thread0:54
thread1:55
thread2:56
thread0:57
thread1:58
thread2:59
thread0:60
thread1:61
thread2:62
thread0:63
thread1:64
thread2:65
thread0:66
thread1:67
thread2:68
thread0:69
thread1:70
thread2:71
thread0:72
thread1:73
thread2:74
thread0:75
thread1:76
thread2:77
thread0:78
thread1:79
thread2:80
thread0:81
thread1:82
thread2:83
thread0:84
thread1:85
thread2:86
thread0:87
thread1:88
thread2:89
thread0:90
...
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-21 21:30:01 | 显示全部楼层
TO:lock只保证不会有多个线程同时对某个代码时行写
但不会保证只有一个线程对同个代码进读操作


之所以会出现这种情况,是因为:
public static void Run()
{
lock(thisLock)
{
while (lNum<100)
{
lNum++;
Console.WriteLine("Thread{0}: lNum={1}", Thread.CurrentThread.Name, lNum);
}
}

while循环在lock里面,比如线程1得到线程的互斥权,那么其他线程就无法访问里面的代码:

while (lNum<100)
{}
所以线程1得到互斥权后运行while循环,直到循环到100,才会释放互斥权,当其他线程得到互斥权,运行时发现lNum已经是100了,所以也都退出了..

而如果:

while (count <= 100)
            {
                mx.WaitOne();

                count++;
                Debug.WriteLine("thread" + Thread.CurrentThread.Name + ":" + count.ToString());
                Thread.Sleep(100);

                mx.ReleaseMutex();
            }
即while循环在外面,效果就不一样了,在循环内部得到互斥权,自增1前得到互斥权,自增1后释放互斥权,所以每个线程都会有将变量增1的机会..


回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-22 01:00:02 | 显示全部楼层
以上我写的例子,也只能说明一下问题,但其实是不够好的..

虽然是while (count <= 100),但其实运行到最后,count的值可能会到101..具体原因楼主可以自己分析一下,如果不清楚,可以与我讨论一下..
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-4-9 13:15:02 | 显示全部楼层
确实不知道为什么会输出101....
回复

使用道具 举报

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

本版积分规则

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

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