欢迎光临

木子屋

标题: C#多线程编程笔记

作者: dnawo

日期: 2011-08-17 11:41 AM

分类: Win编程

内容: 今天在调试一段多线程程序时老出错，经过一番分析后发现了原因，为了便于说明问题，将代码简化如下：
复制内容到剪贴板 程序代码//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
*/
编程心得
在多线程编程时，应避免在多个线程中修改和使用同一个变量的情形出现。

+ 查看当前日志评论 (0)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.867 ms

返回

标题: C#多线程编程笔记

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.867 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.898 ms

返回