多线程集合安全性问题

gxingmin 2007-07-17 01:42:54
有个公共集合集合ArrayList m_arryList;
现在多线程操作和访问这个集合变量
如何在其他线程对m_arryList增加或减少Items时,保证其他线程枚举时(foreach...)不会出错?
...全文
207 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RedGoldFish 2007-07-17
  • 打赏
  • 举报
回复
代码如下,其中枚举时(foreach...)的方法二更好,加锁时间短于方法一.

ArrayList m_arryList = new ArrayList();

//在线程A中运行
private void AddOrRemove()
{
lock (m_arryList.SyncRoot)
{
Object theItem = new object();

m_arryList.Add(theItem);
m_arryList.Remove(theItem);
}
}


//在线程B中运行: 方法一.
private void EnumArrayList()
{
lock (m_arryList.SyncRoot)
{
foreach (Object theItem in m_arryList)
{
Console.WriteLine(theItem.ToString());
}
}
}

//在线程B中运行: 方法二
private void EnumArrayList2()
{

lock (m_arryList.SyncRoot)
{
Object[] objects = new object[m_arryList.Count];
m_arryList.CopyTo(objects);
}


foreach (Object theItem in objects)
{
Console.WriteLine(theItem.ToString());
}

}
liusong_china 2007-07-17
  • 打赏
  • 举报
回复
学习
Ilovesport 2007-07-17
  • 打赏
  • 举报
回复
每个线程操作m_arryList都这样:
Lock(m_arryList)
{
....m_arryList....;

}
这样就OK了,不会有冲突的问题

lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:

lock(expression) statement_block
其中:

expression
指定要锁定的对象。expression必须是引用类型。
通常,如果要保护实例变量,则expression为this;如果要保护static变量(或者如果临界区出现在给定类的静态方法中),则expression为typeOf(class)。

statement_block
临界区的语句。
摘自msdn
lock (this)只保护本实例
Ilovesport 2007-07-17
  • 打赏
  • 举报
回复
每个线程操作m_arryList都这样:
Lock(ListView1)
{
....m_arryList....;

}
这样就OK了,不会有冲突的问题

lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:

lock(expression) statement_block
其中:

expression
指定要锁定的对象。expression必须是引用类型。
通常,如果要保护实例变量,则expression为this;如果要保护static变量(或者如果临界区出现在给定类的静态方法中),则expression为typeOf(class)。

statement_block
临界区的语句。
摘自msdn
lock (this)只保护本实例
whb147 2007-07-17
  • 打赏
  • 举报
回复
没有遇到过
lvxianda 2007-07-17
  • 打赏
  • 举报
回复
lock(this){
代码
}
shilei831115 2007-07-17
  • 打赏
  • 举报
回复
任何一个 使用的时候都要锁住变量,
gxingmin 2007-07-17
  • 打赏
  • 举报
回复
谢谢各位回复.
能不能再详细点?谢谢!
Avoid 2007-07-17
  • 打赏
  • 举报
回复
线程同步
ztenv 2007-07-17
  • 打赏
  • 举报
回复
把对集合的访问保护起来lock(),这样就可以不出错了,是一个互斥的问题
gxingmin 2007-07-17
  • 打赏
  • 举报
回复
有个公共集合变量ArrayList m_arryList;
现在多线程操作和访问这个集合变量
如何在某个线程对m_arryList增加或减少Items时,保证其他线程枚举时(foreach...)不会出错?

110,561

社区成员

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

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

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