C#多线程编程笔记

今天在调试一段多线程程序时老出错,经过一番分析后发现了原因,为了便于说明问题,将代码简化如下:

//using System.Threading;
for (int i = 1; i <= 10; i++)
{
    Thread thread = new Thread(() => Console.WriteLine(i));
    thread.Start();
}

/*
3
3
4
5
7
8
9
9
10
11
*/

原本希望程序能输出数字1到10,每个数字输出一次,顺序可不固定,结果呢,完全不是预期的,但想想得出这样的结果并不奇怪,多线程类似于异步,这样就可能在执行某个线程时,i的值已经被修改了,分析上边结果可知,在执行线程1和线程2代码时,i的值已被赋值为3了。

第二版

//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
    Thread thread = new Thread(() =>
    {
        lock (obj)
        {
            counter++;
        }
        Console.WriteLine(counter);
    });
    thread.Start();
}

/*
1
2
3
4
5
6
7
8
9
10
*/

问题解决了吗?加个Thread.Sleep看下:

//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
    Thread thread = new Thread(() =>
    {
        lock (obj)
        {
            counter++;
        }
        Thread.Sleep(1000);
        Console.WriteLine(counter);
    });
    thread.Start();
}

/*
10
10
10
10
10
10
10
10
10
10
*/

问题并没解决,原因和第一版类似,在执行前面9个线程的代码时,counter的值已被第10个线程改为10了。

正式版

//using System.Threading;
object obj = new object();
int counter = 0;
for (int i = 1; i <= 10; i++)
{
    Thread thread = new Thread(() =>
    {
        int num = 0;
        lock (obj)
        {
            num = ++counter;
        }
        Console.WriteLine(num);
    });
    thread.Start();
}


/*
1
2
3
4
5
6
7
8
9
10
*/

编程心得

在多线程编程时,应避免在多个线程中修改和使用同一个变量的情形出现。

上一篇: C#使用LINQ查找同名文件示例
下一篇: 淘宝助理辅助工具
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 3731
发表评论
登录后再发表评论!