关于多线程函数参数传递的问题

Immortalwings 2019-02-17 04:21:54
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int x = 0;int y = 0;
var t1 = new Thread1();
Thread t11 = new Thread(() => t1.hanshu(ref x,ref y));
t11.Start();

for (int s= 0;s<100;s++)
{
Console.WriteLine("x=" + x + " y=" + y);
}
Console.ReadLine();



}
}

}


线程类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{

class Thread1
{
public void hanshu(ref int x,ref int y)
{
for (int s = 0; s < 100; s++)
{
x++;
}
for (int s = 0; s < 100; s++)
{
y++;
}


}
}

}



为什么运行结果是图片中的那样
...全文
346 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jx315425246 2019-03-16
  • 打赏
  • 举报
回复
多线程同步

ManualResetEvent mute = new ManualResetEvent(false); //


for (int s = 0; s < 100; s++)
{
mute.Reset();
x++;y++;
mute.WaitOne();
}

for (int s= 0;s<100;s++)
{
mute.Set();
Console.WriteLine("x=" + x + " y=" + y);
}



取值时考虑线程同步。
牧歌ing 2019-03-15
  • 打赏
  • 举报
回复
证明电脑一瞬间完成了所有操作
可以直接存个List<int>
然后对list进行打印
  • 打赏
  • 举报
回复
电脑程序运行不骗人。至于说“有没有错”要看你的需求而定。 多线程并发情况下,你想去调试,这几乎是不可能的,因为人脑子根本不够用了,数据异步并发操作的诡异结果产生了组合爆炸。所以要编写并发程序,更重要地是按规矩、按设计去编程(实际上测试往往是先顺序执行几遍,再并发即使个线程执行几遍),而不是马后炮地弄一大堆结果再来猜了。
Immortalwings 2019-02-22
  • 打赏
  • 举报
回复
也就是说代码方面是没有错的是吗
Immortalwings 2019-02-22
  • 打赏
  • 举报
回复
引用 6 楼 正怒月神 的回复:
额。比速度啊?
/笑哭 对,我想看看另一个线程运行的过程
Immortalwings 2019-02-22
  • 打赏
  • 举报
回复
引用 5 楼 秋的红果实 的回复:
不知道lz要达到什么效果

首先你用了ref,意味着x,y的值在Thread1里面被改变,相当于和主线程共享了变量,要小心了
还有,子线程被开出(t11.Start();)后,具体执行时间由操作系统决定,跟你当前计算机的工作状态有关,也许先于主线程执行,也许不是,这样,共享变量的值就难于确定了,会造成危险
你可以了解下async,await
谢谢层主热心回答
OrdinaryCoder 2019-02-19
  • 打赏
  • 举报
回复
可以把100加大看现象,比如加到10万,应该会有不一样的感觉。
正怒月神 2019-02-19
  • 打赏
  • 举报
回复
额。比速度啊?
秋的红果实 2019-02-18
  • 打赏
  • 举报
回复
不知道lz要达到什么效果 首先你用了ref,意味着x,y的值在Thread1里面被改变,相当于和主线程共享了变量,要小心了 还有,子线程被开出(t11.Start();)后,具体执行时间由操作系统决定,跟你当前计算机的工作状态有关,也许先于主线程执行,也许不是,这样,共享变量的值就难于确定了,会造成危险 你可以了解下async,await
exception92 2019-02-18
  • 打赏
  • 举报
回复
t11 执行的很快,执行到第二for的时候,计算x,y的函数已经执行完毕.
  • 打赏
  • 举报
回复
嗯是的,这说明 Console.WriteLine 执行一次之后,hanshu 就已经执行完了。
wanghui0380 2019-02-17
  • 打赏
  • 举报
回复
循环100次对于计算机来说要多长时间
Immortalwings 2019-02-17
  • 打赏
  • 举报
回复
运行结果直接从0蹦到100


x=0 y=0
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100
x=100 y=100

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧