gpt4 book ai didi

.net - C# Locks - 在循环之前还是在循环内部锁定更好?

转载 作者:行者123 更新时间:2023-12-01 15:55:02 41 4
gpt4 key购买 nike

我目前正在用 C# 制作一个 Web Crawler,我有一个方法可以接收 HTML 字符串,从中提取链接并将链接插入到所有捕获的链接列表中。

由于它是多线程的,因此我使用了锁来防止同时从几个不同的线程访问所有字符串的列表。

哪个更好用锁?

这:

void ProcessHTML(string HTML)
{
List<string> Links = GetLinks(HTML);
for (int i = 0; i < Links.Count; i++)
{
lock (WebsitesHash)
{
lock (AllLinks)
{
if (!WebsitesHash.ContainsKey(Links[i]))
{
WebsitesHash[Links[i]] = true;
AllLinks.Add(Links[i]);
}
}
}
}
}

或这个:
void ProcessHTML(string HTML)
{
List<string> Links = GetLinks(HTML);
lock (WebsitesHash)
{
lock (AllLinks)
{
for (int i = 0; i < Links.Count; i++)
{
if (!WebsitesHash.ContainsKey(Links[i]))
{
WebsitesHash[Links[i]] = true;
AllLinks.Add(Links[i]);
}
}
}
}
}

通常认为哪个更好 - 锁定每次迭代,还是锁定所有迭代?

其他可能相关的代码:
void StartCrawl(string Seed)
{
AllLinks.Capacity = 1000 * 1000 * 10;
StreamWriter Log = new StreamWriter(File.Open("Websites.txt", FileMode.Append));
string HTML = GetHTML(Seed);
ProcessHTML(HTML);
for (int i = 0; i < AllLinks.Count; i++)
{
if (!Work)
{
Log.Close();
WebsitesHash = new Dictionary<string, bool>();
break;
}
Log.WriteLine(AllLinks[i]);
websText.Text = AllLinks.Count + "";
try { HTML = GetHTML(AllLinks[i]); }
catch { continue; }
Thread Parser = new Thread(() => ProcessHTML(HTML));
Parser.Start();
}
}

最佳答案

在这种情况下,这并不重要。

链接在锁外检索,因此唯一的操作是将少量字符串添加到列表中。那是很小的,所以这个问题没有实际意义。

如果工作量更大,锁定在循环内会更好。

虽然锁很便宜,但您可以通过锁定一次来进行一些优化。您可以使用 private object lockObject = new object();更清楚地了解协议(protocol)。

关于.net - C# Locks - 在循环之前还是在循环内部锁定更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28251614/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com