不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
C#多线程编程笔记
编辑:dnawo 日期:2011-08-17
今天在调试一段多线程程序时老出错,经过一番分析后发现了原因,为了便于说明问题,将代码简化如下:
原本希望程序能输出数字1到10,每个数字输出一次,顺序可不固定,结果呢,完全不是预期的,但想想得出这样的结果并不奇怪,多线程类似于异步,这样就可能在执行某个线程时,i的值已经被修改了,分析上边结果可知,在执行线程1和线程2代码时,i的值已被赋值为3了。
第二版
问题解决了吗?加个Thread.Sleep看下:
问题并没解决,原因和第一版类似,在执行前面9个线程的代码时,counter的值已被第10个线程改为10了。
正式版
编程心得
在多线程编程时,应避免在多个线程中修改和使用同一个变量的情形出现。
复制内容到剪贴板
程序代码

//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
*/
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
*/
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
*/
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
*/
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 | 引用: 0 | 查看次数: 3731
发表评论
请登录后再发表评论!