我在C#中开发多线程应用程序。
我想要在第一个线程需要时初始化的资源。
该资源可以被必要的线程使用。
我需要检测,当这个资源是空闲的(有任何线程使用它)以便销毁它,以后,当另一个线程请求它时,再次初始化它。
有什么想法吗?
答案 0 :(得分:0)
您可以执行以下操作:
public class SomeClass // basic class for example
{
public void foo() { }
public void Close()
{
// release any resources you might have open
}
}
public static class SingletonInstance
{
private static object m_lock = new object();
private static SomeClass m_instance = null;
private static int m_counter = 0;
public static SomeClass Instance
{
get
{
lock (m_lock) {
if (m_instance == null) {
m_instance = new SomeClass();
}
++m_counter;
}
return m_instance;
}
set
{
lock (m_lock) {
if (m_counter > 0 && --m_counter == 0) {
m_instance.Close();
m_instance = null;
}
}
}
}
}
然后在其他一些初始化代码中,您可以简单地说SingletonInstance.Instance = null;
以静态初始化SingletonInstance
(因为静态类在第一次调用时初始化)。在任何线程代码之前调用SingletonInstance.Instance = null;
将确保在类的静态init上不发生竞争条件;也就是说,如果2个线程调用SingletonInstance.Instance.foo();
,您仍然可以首先对谁初始化该类进行竞争。
然后在您的线程代码中,您可以执行以下操作:
void MyThreadFunction()
{
SingletonInstance.Instance.foo();
// ... more thread code ...
SingletonInstance.Instance = null;
}
这是一个非常基本的例子,更多的是为了说明这一点,你的需求可能略有不同,但这个想法是一样的。
希望可以提供帮助。
答案 1 :(得分:-1)
您可以将资源包装在单个处理程序中,当任何线程不再引用它时,它将销毁它。
例如,您可以查看here如何创建此类多线程单例对象。在创建对象时初始化资源并在其析构函数中释放它。