c# - 初始化资源并销毁它直到另一个线程需要它

标签 c# multithreading

我正在用 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/

相关文章:

c# - 如何将 Parallel.ForEach 用于 Excel?

c# - 此工具集不支持 TargetFrameworkVersion 'v4.5.1' (ToolsVersion : 4. 0)

c# - C#中的继承问题

c# - c#制表符分隔符中的string.Split函数

c++ - volatile 变量被优化掉了吗?

c# - 如何将多线程与 "for"或 "foreach"循环一起使用?

c# - 在不创建 'ResourceManager' 实例的情况下访问本地化资源字符串?

multithreading - 随着更多 CPU 的添加,原子操作会变慢吗?

c++ - 为什么线程同步不起作用?

c++ - 丢失唤醒 : What if the producer acquires the mutex first?