gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com