Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有最佳实践来实现在同时访问时提供唯一价值的静态功能_C#_Multithreading - Fatal编程技术网

C# 是否有最佳实践来实现在同时访问时提供唯一价值的静态功能

C# 是否有最佳实践来实现在同时访问时提供唯一价值的静态功能,c#,multithreading,C#,Multithreading,静态函数retUnique()返回唯一值。我的问题是如果有 在给定时间点使用相同功能的许多用户,会发生什么情况?是否有最佳实践来确保访问此静态函数的每个用户同时获得唯一值,并且不会面临线程问题 你能给我举个例子吗?静态函数没有什么特别之处,它们或多或少可以在多个线程上安全使用。相反,您需要检查函数访问和修改的数据,并确保它在并发调用时仍然尊重该数据的完整性 下面是一个可能与您的问题相关的示例: private static int myUniqueID = 1; public static in

静态函数
retUnique()
返回唯一值。我的问题是如果有 在给定时间点使用相同功能的许多用户,会发生什么情况?是否有最佳实践来确保访问此静态函数的每个用户同时获得唯一值,并且不会面临线程问题


你能给我举个例子吗?

静态函数没有什么特别之处,它们或多或少可以在多个线程上安全使用。相反,您需要检查函数访问和修改的数据,并确保它在并发调用时仍然尊重该数据的完整性

下面是一个可能与您的问题相关的示例:

private static int myUniqueID = 1;
public static int GetFreshUniqueID()
{
    lock(someObject)
    {
        return myUniqueID++;
    }
}

在这种情况下,保持线程安全的关键是在某些同步上下文中锁定函数,这样我们就不会遇到两个线程在任意一个线程开始递增之前获得相同ID的情况。您的情况可能会有所不同。

这不是一个简单的同步问题吗


在函数的开头应用锁,然后在结尾释放锁。

假设您只想返回唯一的递增整数值,最简单的安全方法可能是使用私有静态计数器和私有静态锁对象。比如:

private static int s_UniqueCounter; // starts at 0 by default
private static readonly object s_UniqueCounterLock = new object();

public static int GetUnique()
{
    lock (s_UniqueCounterLock)
    {
        s_UniqueCounter++;
        return s_UniqueCounter;
    }
}
由您来确保使用特定的锁对象来保护对静态计数器成员的任何其他访问(这就是为什么它们被声明为私有的,当然,因此拥有它们的类控制任何访问)。对于这种用法,可能不应该在其他任何地方访问它,但是您可能需要查看当前值以查看它被调用了多少次。这可能也应该受到锁的保护(以确保结果是最新的):


(someobject)指的是什么?您可能希望参考文档中的lock语句:mquander抢先一步(我很难让代码正确格式化)。您可能希望lock对象类似于:private static readonly object sUniqueLock=new object();就在我的唯一身份证之后声明。并查看文档了解更多信息。如果您在问题标题中提出问题,您可能会得到更多关注(请参阅常见问题解答)。也许类似“如何最好地实现一个静态函数,以便在每次调用时跨所有线程返回一个唯一的值?也可以添加诸如最佳实践和线程安全之类的标记。它应该允许您进行编辑。”。
internal static int QueryUniqueCount() // or this could be private, or public
{
    lock (s_UniqueCounterLock)
    {
        return s_UniqueCounter;
    }
}