两个线程threadA、threadB。
定义一个类C。C的主要作用是不定时的获取数据,放入C的静态变量容器d中(例如d是一个list)。
threadA开始运行,运行内容为,实例化一个C,开始C的功能。
threadB开始运行,运行内容为,每隔10秒钟,访问c.d,然后将c.d置空。
问题就是,当threadB,访问c.d后,然后置空这个过程中,threadA有没有可能又往c.d中加入了新的数据?这样就会丢失数据。
如果是这样,
如何在threadB访问c.d并置空这段代码运行时,阻止threadA往c.d加入数据呢?
我再举个简单的例子说明下问题:
threadA每隔1毫秒往c.d放入一个数据,例如到3毫秒时,放入了1、2、3,
这时,threadB访问了c.d,得到1、2、3然后将c.d置空。如果再访问c.d中的内容,会是4、5、6吗?在未加锁的情况下,会不会成了5、6丢失了4呢?
因为threadA放入数据4时,可能正好被threadB置空了
定义一个类C。C的主要作用是不定时的获取数据,放入C的静态变量容器d中(例如d是一个list)。
threadA开始运行,运行内容为,实例化一个C,开始C的功能。
threadB开始运行,运行内容为,每隔10秒钟,访问c.d,然后将c.d置空。
问题就是,当threadB,访问c.d后,然后置空这个过程中,threadA有没有可能又往c.d中加入了新的数据?这样就会丢失数据。
如果是这样,
如何在threadB访问c.d并置空这段代码运行时,阻止threadA往c.d加入数据呢?
我再举个简单的例子说明下问题:
threadA每隔1毫秒往c.d放入一个数据,例如到3毫秒时,放入了1、2、3,
这时,threadB访问了c.d,得到1、2、3然后将c.d置空。如果再访问c.d中的内容,会是4、5、6吗?在未加锁的情况下,会不会成了5、6丢失了4呢?
因为threadA放入数据4时,可能正好被threadB置空了
解决方案 »
- 接手一个有50万行源代码的ERP程序?
- 关于GDI+中Rectangle的不解问题?
- 两个窗体
- C# 如何实现使用flash并进行录音?
- winform中打开一个窗体后怎么能让父窗体停止一切活知道新窗体关闭
- C# 如何循环输出两个DateTimerPicker控件之间的时间
- 如何将一个字符串中的“\”换成"\\"???
- 正在调用的 ServicedComponent 配置不正确(请使用 RegSvcs 重新注册)????
- C# Form相关,return Form——如何加载自定义事件?
- C# 操作excel的问题,解决定给分。
- 关于socket异步通信
- 怎么截取图片文件上的固定区域保存为另一个文件?
因为获取-清空 这一过程完成前不允许threadA操作list才行,而且肯定是在threadB中获取-清空。
{
获取list,
清空list
}
如何将大括号中的代码原子化?
然后lock(C.syncRoot)
{
操作
}
不可以?
或者你ThreadA, ThreadB也总是得在一个类里来创建的吧。比如说类A
那么你类A里
private readonly object syncRoot = new object();
//ThreadA的方法
void FuncA()
{
lock(syncRoot)
{
C.获取数据方法()
}
}void FuncB()
{
lock(syncRoot)
{
C.清空数据方法()
}
}