C# 多线程执行过程探讨
上代码说明问题
大家有看到,Run1方法和Run2方法是在t1线程和t2线程中执行的
而且这2个线程是操作的同一个NetworkStream
我的问题是按照多线程的效果,Run1和Run2同时开始执行了。
他可能是执行Run1里面的int i=100。然后执行完了后就跳到Run2里面去执行Run2里面的int i=1000
当然也可能不跳,继续执行下面的一行代码,具体实际是怎样,得看cpu调度了。
我自己的代码,我知道我都写了哪些行代码,在交替执行的时候可能会执行哪些代码我都知道。
这一切都在我的掌控之中。
但是ns.Write这个方法不是我写的,是.Net Framework里面的方法,它的内部有哪些代码我也不知道。
我担心的是,在线程中调用.Net Framework里面类的方法的时候,这些方法内部肯定不止1行代码
所以这些方法内部的代码会不会也在交替着执行呢?
不知道我表述的问题有没有表述清楚,大家有没有理解。
我再换一个方式来阐述这个问题:
大家有看到我的ns.Write方法是分别往同一个网络流里面写字节数组。
data1字节数组里面包含的全部都是1,而data2字节数组里面包含的全部都是0.
Run1方法是在往字节流西面写入1
Run2方法是在往字节流里面写入0
这2个方法操作的是同一个网络流,并且同时在运行
因此,最终的结果这个网络流里面的数据是一下哪2种情况:
A:1111111.....111110000000......000000
B:0000000.....000001111111......111111
C:101110001110111110101010000111000011
如果是A或者B这2种情况的话,我就感觉线程是以我写的代码为准
一行代码完全执行完毕后才有可能跳入到其他线程中去执行代码
如果是C这种情况,就说明不是我写的代码也有可能会交替执行,而且它内部怎么交替我就不知道。
如果真是这样的情况,用多线程,我感觉好危险,必须要锁。
我有做过测试,我又写了一个程序,来读这个网络流,发现读出来的结果是A和B其中的1个,没有出现C的情况。
但是我也仅仅是测试了十几次,虽然没有出现C这种情况,我觉得有可能是我运气好,CPU调度的太完美。
所以发个帖子,征求大家的结论,希望能有个结果
拜求各位高人指点迷津。
class Program
{
static Thread t1 = new Thread(new ThreadStart(Run1));
static Thread t2 = new Thread(new ThreadStart(Run2));
static NetworkStream ns = null;
static byte[] data1 = new byte[99999];
static byte[] data2 = new byte[99999];
static void Main(string[] args)
{
for (int i = 0; i < data1.Length; i++)
{
data1[i] = 1;
}
TcpClient client = new TcpClient("127.0.0.1", 8855);
ns = client.GetStream();
t1.Start();
t2.Start();
}
static void Run1()
{
int i=100;//无意义
ns.Write(data1, 0, data1.Length);
}
static void Run2()
{
int i=1000;//无意义
ns.Write(data2, 0, data2.Length);
}
}
大家有看到,Run1方法和Run2方法是在t1线程和t2线程中执行的
而且这2个线程是操作的同一个NetworkStream
我的问题是按照多线程的效果,Run1和Run2同时开始执行了。
他可能是执行Run1里面的int i=100。然后执行完了后就跳到Run2里面去执行Run2里面的int i=1000
当然也可能不跳,继续执行下面的一行代码,具体实际是怎样,得看cpu调度了。
我自己的代码,我知道我都写了哪些行代码,在交替执行的时候可能会执行哪些代码我都知道。
这一切都在我的掌控之中。
但是ns.Write这个方法不是我写的,是.Net Framework里面的方法,它的内部有哪些代码我也不知道。
我担心的是,在线程中调用.Net Framework里面类的方法的时候,这些方法内部肯定不止1行代码
所以这些方法内部的代码会不会也在交替着执行呢?
不知道我表述的问题有没有表述清楚,大家有没有理解。
我再换一个方式来阐述这个问题:
大家有看到我的ns.Write方法是分别往同一个网络流里面写字节数组。
data1字节数组里面包含的全部都是1,而data2字节数组里面包含的全部都是0.
Run1方法是在往字节流西面写入1
Run2方法是在往字节流里面写入0
这2个方法操作的是同一个网络流,并且同时在运行
因此,最终的结果这个网络流里面的数据是一下哪2种情况:
A:1111111.....111110000000......000000
B:0000000.....000001111111......111111
C:101110001110111110101010000111000011
如果是A或者B这2种情况的话,我就感觉线程是以我写的代码为准
一行代码完全执行完毕后才有可能跳入到其他线程中去执行代码
如果是C这种情况,就说明不是我写的代码也有可能会交替执行,而且它内部怎么交替我就不知道。
如果真是这样的情况,用多线程,我感觉好危险,必须要锁。
我有做过测试,我又写了一个程序,来读这个网络流,发现读出来的结果是A和B其中的1个,没有出现C的情况。
但是我也仅仅是测试了十几次,虽然没有出现C这种情况,我觉得有可能是我运气好,CPU调度的太完美。
所以发个帖子,征求大家的结论,希望能有个结果
拜求各位高人指点迷津。
...全文
相关推荐
用c#写的多线程PING的程序
用c#写的多线程PING的程序 可以将结果统计
C# Lock 解读
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。
C#多线程应用技术面对面探讨[图]
实例程序说明 本文的实例程序包括一个列表框、三个按钮。程序使用一个新的线程来运行一个后台处理,结果在列表框中显示。按钮button1启动一个计算平方的线程。按钮button2停止后台处理线程。按钮button3退出程序。程序运行情况如图1所示。
C#多线程实例
C#多线程实例
c# 多线程 上位机
c# 上位机,采用多线程技术及模拟消息队列


