多线程同时调用一个函数

zhangtong_76 2014-01-14 10:33:53
大家好,我想请教一个问题,请大家多多帮助
classB
{
public void Way()
{
while(true)
{}
}
}

class A
{
foreach(B b in bs)

Thread thread=new Thread(b.Way);
thread.start();

}

我这样子写会不会有问题呢,多个线程都要调用Way()这个方法?但是调用的又都是不同对象的方法?
清大家帮忙解惑
...全文
1009 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
coastarica 2016-04-19
  • 打赏
  • 举报
回复
手头有线程问题,正好找到这个帖子,项目是delphi的,想来与C#差不多,结果用delphi+OTL的线程库做了一下测试,结果有点出乎意料: 1、多个线程内部调用另一单元的同一函数,存在重入问题: 多个线程调用同一函数E,将E的周期拉长,以让多个线程可以同步执行在E上,通过设置一个全局变量,可以发现,第二次进入的E修改了前一次进入的值 2、主线程的A,很短时间内多次调用B,B内部生成异步procedure C,表面看,似乎是单一线程启动了多个独立线独,不存在共享冲突,但实际上能B会多次重入这个C procedure,执行顺序是混乱的。
Code従業員 2014-01-15
  • 打赏
  • 举报
回复
问题有歧义: 1、你有个X+Y=?的函数,有很多线程都要用到这个计算,你想问,线程1调用的时候线程2也调用是否有影响? 答案:没影响,就像全球那么多WINDOWS一样,我的系统崩溃了,你一点影响都没有,因为你已经生成本地"副本"。 2、你希望同一时间只能运行一条的运算,比如将指定数据插入数据库,防止其他线程重复插入。 答案:加锁保证唯一性。
BenBenBears 2014-01-15
  • 打赏
  • 举报
回复
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题,说到底加锁也是为了避免同时占用同样的资源,不同对象的话一般是不需要的。
gomoku 2014-01-15
  • 打赏
  • 举报
回复
引用 3 楼 zhangtong_76 的回复:
就是说同时调用的是不同对象的方法也是要加锁的
一般不需要。 是否需要加锁,关键看是否有对“同一套资源”的同时操作。

class B
{
   int i;    // 不同的B实例,有各自的成员i。调用不同的实例不需要加锁。
   public void Way()
   {
       while(true)
       { i++; }
   }
}

class B
{
   static int i;    // 不同的B实例,用同一个静态成员i。调用不同的实例也*需要*加锁。
   public void Way()
   {
       while(true)
       { i++; }     // TODO: 添加同步处理
   }
}
zhangtong_76 2014-01-14
  • 打赏
  • 举报
回复
就是说同时调用的是不同对象的方法也是要加锁的
本拉灯 2014-01-14
  • 打赏
  • 举报
回复

classB
 {
     private object objlock=new object();
     public void Way()
     {
          while(true)
          {
            lock(objlock)
            {
              /XXXXX;
            }
          }
     }
 }


bdmh 2014-01-14
  • 打赏
  • 举报
回复
如果这个函数有写操作或者不支持多人同时的操作,就要加锁

110,499

社区成员

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

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

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