我正在用 C# 开发多线程应用程序。
我有一个资源,我想在第一个线程需要它时对其进行初始化。
此资源可以根据需要由尽可能多的线程使用。
我需要检测这个资源何时空闲(有任何线程正在使用它)以便销毁它,稍后,当另一个线程请求它时,再次初始化它。
有什么想法吗?
最佳答案
您可以执行以下操作:
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;
将确保类的静态初始化不会发生竞争条件;也就是说,如果 2 个线程调用 SingletonInstance.Instance.foo();
,您仍然可以有一个关于谁首先初始化该类的竞争条件。
然后在您的线程代码中您可以执行如下操作:
void MyThreadFunction()
{
SingletonInstance.Instance.foo();
// ... more thread code ...
SingletonInstance.Instance = null;
}
虽然这是一个非常基本的示例,更多的是为了说明这一点,您的需求可能略有不同,但想法是一样的。
希望对您有所帮助。
关于c# - 初始化资源并销毁它直到另一个线程需要它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34307990/