使用线程时检查条件失败
本文关键字:条件 失败 检查 线程 | 更新日期: 2023-09-27 17:56:01
我在应用程序中使用线程
我正在创建一个文件夹,而该文件夹尚不存在
if (!ExistingFolders.Contains(currentFolder)){
if (lastCreatedFolder != folder) {
lastCreatedFolder = folder;
CreateNewFolder(context, siteLink, lName, fName);
}
}
当有 5 个线程并行运行时,这种情况不起作用!!例如,所有 5 个线程都在尝试创建一个名为"New"的文件夹第一个正在创建,而其余的则抛出"文件夹已存在"错误,因为它已经创建
在这种情况下,我该如何检查状况?
在这里,所有 5 个线程都并行运行,并且条件适用于所有情况,因为只有第一种情况才应该为真
这是一个竞争条件,您必须设置一个同步机制来修复它。 例如,通过使用 Lock 关键字,您可以确保一次只能由一个线程访问代码范围。 这里 LockObject 是在这些操作之前创建的对象。 例如,只读常量很常见。
lock(lockobject){
if (!ExistingFolders.Contains(currentFolder)){
if (lastCreatedFolder != folder) {
lastCreatedFolder = folder;
CreateNewFolder(context, siteLink, lName, fName);
}
}
}
在这种情况下,我该如何检查状况?
通过使用同步原语,例如lock
:
public readonly object syncRoot = new object();
lock (syncRoot)
{
if (!ExistingFolders.Contains(currentFolder))
{
if (lastCreatedFolder != folder)
{
lastCreatedFolder = folder;
CreateNewFolder(context, siteLink, lName, fName);
}
}
}
这样,只有到达 lock
语句的第一个线程将持有锁,而所有其他线程等待他释放锁。完成后,所有其他线程将看到该文件夹已创建。
请注意,如果每个线程都访问包含锁的类的不同实例,则应将其设为static
。