初始化资源并将其销毁,直到另一个线程需要它

时间:2015-12-16 09:15:30

标签: c# multithreading

我在C#中开发多线程应用程序。

我想要在第一个线程需要时初始化的资源。

该资源可以被必要的线程使用。

我需要检测,当这个资源是空闲的(有任何线程使用它)以便销毁它,以后,当另一个线程请求它时,再次初始化它。

有什么想法吗?

2 个答案:

答案 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如何创建此类多线程单例对象。在创建对象时初始化资源并在其析构函数中释放它。