我正在尝试了解C#应用程序中的多线程。我继承了一个名为SecurityComponentBase的基类中包含以下代码的应用程序:
m_permissionsLock.EnterWriteLock();
try
{
if (m_grantedPermissions.Count > 0)
{
m_grantedPermissions.Clear();
m_loggingComponent.WriteSecurityLog(
"Security permissions cleared for user: " + CurrentLoggedUser.Username);
}
foreach (var p in permisions)
{
m_loggingComponent.WriteSecurityLog("Security permission: "+ p.PermissionName + " Granted to user: " + userName);
m_grantedPermissions.Add(p.PermissionName, p);
}
}
finally
{
m_permissionsLock.ExitWriteLock();
}
m_permissionsLock定义为:
private readonly ReaderWriterLockSlim m_permissionsLock = new ReaderWriterLockSlim();
m_grantedPermissions定义为:
private readonly Dictionary<string, Permission> m_grantedPermissions = new Dictionary<string, Permission>();
开发人员什么时候才知道他有将这个字典包装成锁?对我来说,我甚至不知道其他线程会来自哪里。记住我是这个多线程的新手。但我怎么知道我必须这样做?
答案 0 :(得分:3)
开发人员什么时候才能知道他必须把这个字典包装成锁?
我们遵守以下原则:
以任何方式修改字典或其内容时,获取写入锁定。
在访问字典或其内容时获取读取锁定,而不进行任何修改。
控制对字典的访问,因此在此课程中只有我们可以访问它。访问字典必须通过我们。
在您粘贴的代码中演示了#1点。第3点也在您的代码中使用private
m_grantedPermissions
声明进行了演示。只有此类中的代码才能访问私有成员。
对我来说,我甚至不知道其他线程会来自哪里。
调用线程来自哪里是不相关的。当一个线程执行这个类的代码时,开发人员可以发现你正在阅读和编写字典的位置,并且可以相应地包装每个引用。请记住,只有此类才能访问字典。您无需搜索整个解决方案。只是一个班级。
在Visual Studio中,双击m_grantedPermissions
应突出显示每个实例;您还可以搜索“m_grantedPermissions”以查找对它的每个引用。
对m_grantedPermissions
的每个引用都应包含在正确的锁中。