我在我的应用程序中使用线程
我正在创建一个文件夹,当文件夹已经不存在时
if (!ExistingFolders.Contains(currentFolder)){
if (lastCreatedFolder != folder) {
lastCreatedFolder = folder;
CreateNewFolder(context, siteLink, lName, fName);
}
}
当有5个线程并行运行时,这种情况不起作用!! 例如,所有5个线程都在尝试创建名为“New”的文件夹 第一个是创建的,而其余的则抛出“文件夹已存在”错误,因为它已经创建了
在这种情况下如何检查条件?
这里所有5个线程并行运行,条件适用于所有情况,因为它应该只适用于第一种情况
答案 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
。