VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: irwin8888

问线程的奇怪问题

[复制链接]

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-1-27 11:00:01 | 显示全部楼层
加bool变量那个看起来好像可行,但.net已给出readerwriterlock类。。。我觉得是不是应该使用这个类呢
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-1-28 19:00:02 | 显示全部楼层
怎么样保证只有一个线程在读全局变量?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-8 02:00:01 | 显示全部楼层
1、使用Monitor.Enter
2、lock
3、把需要同步的代码独立出一个方法,在该方法上加上MethodImpl属性
c#语法:
[MethodImpl(MethodImplOptions.Synchronized)]
public void doSomething()
{
  //处理全局变量
}
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-9 16:15:01 | 显示全部楼层
public class T
{
        public static long lNum=0;
        public static void Main()
        {
                const int MaxThread=7;
                Thread[] arrt=new Thread[7];
                for (int i=0;i<MaxThread;i++)
                {
                        arrt[i]=new Thread(new ThreadStart(Run));
                        arrt[i].Name=i.ToString();
                        arrt[i].Start();
                }
               
        }
        private static object thisLock=new object();       
        public static void Run()
        {
                lock(thisLock)
                {
                        while (lNum<100)
                        {
                                lNum++;
                                Console.WriteLine("Thread{0}: lNum={1}", Thread.CurrentThread.Name, lNum);
                        }
                }
        }
}

/*-----------------------------------------------
Output:
Thread0: lNum=1
Thread0: lNum=2
Thread0: lNum=3
Thread0: lNum=4
Thread0: lNum=5
Thread0: lNum=6
Thread0: lNum=7
Thread0: lNum=8
Thread0: lNum=9
Thread0: lNum=10
Thread0: lNum=11
Thread0: lNum=12
Thread0: lNum=13
Thread0: lNum=14
Thread0: lNum=15
Thread0: lNum=16
Thread0: lNum=17
Thread0: lNum=18
Thread0: lNum=19
Thread0: lNum=20
Thread0: lNum=21
Thread0: lNum=22
Thread0: lNum=23
Thread0: lNum=24
Thread0: lNum=25
Thread0: lNum=26
Thread0: lNum=27
Thread0: lNum=28
Thread0: lNum=29
Thread0: lNum=30
Thread0: lNum=31
Thread0: lNum=32
Thread0: lNum=33
Thread0: lNum=34
Thread0: lNum=35
Thread0: lNum=36
Thread0: lNum=37
Thread0: lNum=38
Thread0: lNum=39
Thread0: lNum=40
Thread0: lNum=41
Thread0: lNum=42
Thread0: lNum=43
Thread0: lNum=44
Thread0: lNum=45
Thread0: lNum=46
Thread0: lNum=47
Thread0: lNum=48
Thread0: lNum=49
Thread0: lNum=50
Thread0: lNum=51
Thread0: lNum=52
Thread0: lNum=53
Thread0: lNum=54
Thread0: lNum=55
Thread0: lNum=56
Thread0: lNum=57
Thread0: lNum=58
Thread0: lNum=59
Thread0: lNum=60
Thread0: lNum=61
Thread0: lNum=62
Thread0: lNum=63
Thread0: lNum=64
Thread0: lNum=65
Thread0: lNum=66
Thread0: lNum=67
Thread0: lNum=68
Thread0: lNum=69
Thread0: lNum=70
Thread0: lNum=71
Thread0: lNum=72
Thread0: lNum=73
Thread0: lNum=74
Thread0: lNum=75
Thread0: lNum=76
Thread0: lNum=77
Thread0: lNum=78
Thread0: lNum=79
Thread0: lNum=80
Thread0: lNum=81
Thread0: lNum=82
Thread0: lNum=83
Thread0: lNum=84
Thread0: lNum=85
Thread0: lNum=86
Thread0: lNum=87
Thread0: lNum=88
Thread0: lNum=89
Thread0: lNum=90
Thread0: lNum=91
Thread0: lNum=92
Thread0: lNum=93
Thread0: lNum=94
Thread0: lNum=95
Thread0: lNum=96
Thread0: lNum=97
Thread0: lNum=98
Thread0: lNum=99
Thread0: lNum=100
*/
回复

使用道具 举报

1

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
 楼主| 发表于 2020-2-10 23:15:02 | 显示全部楼层
lock只保证不会有多个线程同时对某个代码时行写
但不会保证只有一个线程对同个代码进读操作
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-11 10:45:01 | 显示全部楼层
错!

如果你把代码放进lock的块里,那段代码就只能同时被一个线程执行。代码谈不上写操作。
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-19 08:15:01 | 显示全部楼层
不好意思,今天才来看..

原因就是一个同步问题..

不太清楚VB中怎么处理,在C#中可以有很多种方法..

Mutex比较常用..
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-19 20:30:01 | 显示全部楼层
chk1360
支持这种说法
楼主信誉这么低!
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-19 23:45:01 | 显示全部楼层
lock只保证不会有多个线程同时对某个代码时行写
但不会保证只有一个线程对同个代码进读操作
--------------------------------------------------、
这段话更表明楼主思维混乱,言语不清。
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-21 08:00:01 | 显示全部楼层
可能例子不是很好,但也可以说明一定的问题:

static int count = 0;
        static void Main(string[] args)
        {
            const int MaxThread = 7;
            Thread[] arrt = new Thread[7];
            for (int i = 0; i < MaxThread; i++)
            {
                arrt[i] = new Thread(new ThreadStart(threadProc));
                arrt[i].Name = i.ToString();
                arrt[i].Start();
            }
            Console.Read();
        }
        static Mutex mx = new Mutex();
        static void threadProc()
        {
            while (count <= 100)
            {
                mx.WaitOne();

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

                mx.ReleaseMutex();
            }
        }
回复

使用道具 举报

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

本版积分规则

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

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