使用线程时检查条件失败

本文关键字:条件 失败 检查 线程 | 更新日期: 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