使用线程时检查条件失败

时间:2015-06-14 13:38:40

标签: c# .net multithreading

我在我的应用程序中使用线程

我正在创建一个文件夹,当文件夹已经不存在时

if (!ExistingFolders.Contains(currentFolder)){
    if (lastCreatedFolder != folder) {
             lastCreatedFolder = folder;
             CreateNewFolder(context, siteLink, lName, fName);
                                }
                          }

当有5个线程并行运行时,这种情况不起作用!! 例如,所有5个线程都在尝试创建名为“New”的文件夹 第一个是创建的,而其余的则抛出“文件夹已存在”错误,因为它已经创建了

在这种情况下如何检查条件?

这里所有5个线程并行运行,条件适用于所有情况,因为它应该只适用于第一种情况

2 个答案:

答案 0 :(得分:2)

这是竞争条件,您必须使用同步机制来修复它。例如,通过使用lock关键字,您可以确保一次只能访问一个线程的代码范围。这里lockobject是在这些操作之前创建的对象。例如readonly const很常见。

lock(lockobject){

if (!ExistingFolders.Contains(currentFolder)){
    if (lastCreatedFolder != folder) {
             lastCreatedFolder = folder;
             CreateNewFolder(context, siteLink, lName, fName);
                                }
                          }
}

答案 1 :(得分:2)

  

在这种情况下如何检查条件?

使用同步原语,例如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