楼上的老兄:具体得太长,写概要 K = ThreadK();//计算要开的线程数,和具体问题规模有关。 for(i=0;i〈k;i++) { Data MyData = new Data();//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。 Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyData.Deal)); };现在是MyData在运算前不知道个数,MyData在线程结束后还要进一步处理,问题是如何管理未知个数的MyData
具体得太长,写概要 K = ThreadK();//计算要开的线程数,和具体问题规模有关。 for(i=0;i〈k;i++) { Data MyData = new Data();//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。 Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyData.Deal)); MyThread.Start(); };现在是MyData在运算前不知道个数,MyData在线程结束后还要进一步处理,问题是如何管理未知个数的MyData
http://msdn.microsoft.com/zh-cn/library/6sh2ey19(VS.80).aspx此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不能保证任何实例成员是线程安全的。只要不修改该集合,List 就可以同时支持多个阅读器。通过集合枚举在本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
写访问时加lock控制块就可以了。
大家能有什么办法管理在程序中的动态资源,又不把它们组合成List之类的东西?
谢谢!
private static List<T> _data ;public static List Data
{
get
{
if(_data == null)
{
_data = new List<T>();
}
return _data;
}
}这样变量就跟线程绑定,线程之间不会互相影响
但我觉得最后你还是得把线程运行结果放到共享数据里去~~~
这个世界上不会有不要钱的午餐,你要多线程,又要访问共享数据,又要不发生有次序,总的有地方要损失些东西。
有指针又怎么样?多线程处理共享数据用指针就能避免数据不发生混乱,A线程用指针指向C,B线程也用指针指向C,有个操作是C = C + 1,这个时候A和B同时执行这个操作,你认为C会是多少,是C + 2
还是C + 1?看来楼主对多线程的认识还是比较肤浅的。
K = ThreadK();//计算要开的线程数,和具体问题规模有关。
for(i=0;i〈k;i++)
{
Data MyData = new Data();//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。
Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyData.Deal));
};现在是MyData在运算前不知道个数,MyData在线程结束后还要进一步处理,问题是如何管理未知个数的MyData
K = ThreadK();//计算要开的线程数,和具体问题规模有关。
for(i=0;i〈k;i++)
{
Data MyData = new Data();//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。
Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyData.Deal));
MyThread.Start();
};现在是MyData在运算前不知道个数,MyData在线程结束后还要进一步处理,问题是如何管理未知个数的MyData
从里面进一步提取信息,以供输出。
Data[] myDatas = new Data[K];
AutoResetEvent[] resetEvents = new AutoResetEvent[K];
for(i=0;i〈k;i++)
{
resetEvents[i] = new AutoResetEvent(false);
Data MyData = new Data(resetEvents[i]);//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。
Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyData.Deal));
MyThread.Start();
}; AutoResetEvent.WaitAll(resetEvents);//等待所有线程都处理完....//后面的处理
------------------------------------class Data
{
AutoResetEvent _notifyToInvoker = null;public Data(AutoResetEvent notifyToInvoker )//将信号量传入到你封装的Data类中,以便Deal做完后通知主线程.
{
_notifyToInvoker = notifyToInvoker ;
}
void Deal()
{
...
_notifyToInvoker.Set();
}
}
Data[] myDatas = new Data[K];
AutoResetEvent[] resetEvents = new AutoResetEvent[K];
for(i=0;i〈k;i++)
{
resetEvents[i] = new AutoResetEvent(false);
MyDatas[i] = new Data(resetEvents[i]);//每一线程一个,不共享,因为问题规模太大,频繁写,用lock会影响效率。
Thread MyThread = new System.Threading.Thread(new System.Threading.ThreadStart(MyDatas[i].Deal));
MyThread.Start();
}; AutoResetEvent.WaitAll(resetEvents);//等待所有线程都处理完. ...//后面的处理
------------------------------------ class Data
{
AutoResetEvent _notifyToInvoker = null; public Data(AutoResetEvent notifyToInvoker )//将信号量传入到你封装的Data类中,以便Deal做完后通知主线程.
{
_notifyToInvoker = notifyToInvoker ;
}
void Deal()
{
...
_notifyToInvoker.Set();
}
}