Tag: 锁定

如何使用C#使线程按顺序通过门

我有三个线程,部分代码可以并行运行,一些部分被锁定(当时只有一个线程)。 但是一个锁需要只按顺序让它们进入。 由于这是一个循环,它变得更加复杂。 我该如何表现这种行为? 如果我有一个印刷声明我想收到以下输出:1,2,3,1,2,3,1,2,3 ….目前我收到2,3,1,3,1,3 ,2,1,2 AKA随机顺序。 在三个线程中并行执行的代码: while (true){ lock (fetchLock){ if(done){ break; } //Do stuff one at the time } //Do stuff in parralell lock (displayLock){ //Do stuff one at the time but need’s to be in order. } }

无序线程问题

我在这里问过关于锁的问题,人们回答我的锁实现没有问题。 但我抓住了问题。 这是相同的锁实现,我得到了奇怪的结果。 我希望看到数字从1开始,但它从5开始。例如,如下所示。 class Program { static object locker = new object(); static void Main(string[] args) { for (int j = 0; j < 100; j++) { (new Thread(new ParameterizedThreadStart(dostuff))).Start(j); } Console.ReadKey(); } static void dostuff(dynamic input) { lock (locker) { Console.WriteLine(input); } } }

C#SQLite,数据库在读取后被锁定

我已经阅读了一些关于此的相关post,并不太明白。 发生的事情似乎是在访问数据库之后,数据库被锁定,以便可以读取数据库,但不能写入数据库。 退出应用程序后,数据库将再次解锁。 你能看到它并像我一样无知地跟我说话,指出我处理这种方式的错误吗? public static Partner GetOnePartner(string code) { Partner partner = new Partner(); SQLiteConnection connection = GroomwatchDB.GetConnection(); string sqlStatement = “SELECT * FROM partners WHERE partner_code = @partner_code”; SQLiteCommand command = new SQLiteCommand(sqlStatement, connection); command.Parameters.Add(new SQLiteParameter(“@partner_code”)); command.Parameters[“@partner_code”].Value = code; try { connection.Open(); SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow); if(reader.Read()) { partner.Code = reader[“partner_code”].ToString(); partner.Last_name = […]

如何获得两个地方的锁定,但在一个地方释放?

我是c#的新手。 我需要在两种方法中获得锁定,但是在一种方法中释放。 那会有用吗? public void obtainLock() { Monitor.Enter(lockObj); } public void obtainReleaseLock() { lock (lockObj) { doStuff } } 特别是我可以调用obtainLock然后obtainReleaseLock吗? C#中是否允许“doubleLock”? 始终从同一个线程调用这两个方法,但是在另一个线程中使用lockObj进行同步。 upd:在所有评论之后你对这样的代码有什么看法? 这是理想的吗? public void obtainLock() { if (needCallMonitorExit == false) { Monitor.Enter(lockObj); needCallMonitorExit = true; } // doStuff } public void obtainReleaseLock() { try { lock (lockObj) { // doAnotherStuff } } finally […]

使用现有对象而不是创建特定的锁对象是否安全?

编辑:事实certificate,当我浏览时,我发现一个看起来与我相同的问题,我之前没有找到: 锁(锁柜)和锁(variable_which_I_am_using)之间的区别 我正在寻找一些代码并试图解决锁定问题,我想到了。 现在我注意到在一些代码中我正在审查一个对象是这样创建的: private HashSet clustersInUse = new HashSet(); 然后在代码中进一步使用如下: lock (clustersInUse) { // Do something with the Hashset } 现在,这样做是否存在问题,而不是为锁创建特定对象。 像这样: private object clusterLocker = new object(); 如果上面的clustersInUse以某种方式被置于公共财产中,会发生什么呢? 此外,如果某些东西试图访问clustersInUse而没有锁定它同时它被锁定在另一个线程中会发生什么呢?

正确的方法做Parallel.For从Array计算数据

想:总和x和总和x * x。 其中x = line [i]。 因为多个线程想要读/写“sumAll”和“sumAllQ”,我需要锁定它的访问权限。 问题是锁定类型在这里序列化的东西。 我需要在#“Environment.ProcessorCount”中将此操作拆分为循环,每个循环对数组的一部分求和,最后将它们的结果相加。 但是我如何以编程方式进行编程呢? 示例代码: //line is a float[] Parallel.For(0, line.Length, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, i => { x = (double)line[i]; lock (sumLocker) { sumAll += x; sumAllQ += x * x; } }); 编辑1:Matthew Watson回答基准测试结果 在家。 CPU Core 2 Quad Q9550 @ 2.83 GHz: […]

如何使用c#创建文​​件夹密码

如何使用c#创建Windows文件夹的密码 我应该在创建文件夹时为其设置密码。

lock语句使用什么类型的锁定机制

c#lock关键字是否使用“让步”,“自旋锁定”或混合方法来处理争用? 到目前为止,我对.net锁定语句的搜索没有找到答案。 如果我找到了,我会发布。 到目前为止,我所能找到的是什么时候应该使用一个自旋锁…用Mecki接受的措辞很好。 但我正在寻找关于.net / c#的一些明确的答案或文件,如果有人的话。

‘死锁’只有一个被锁定的物体?

我在C#中遇到multithreading问题。 我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用Invoke()命令。 那部分也很好。 但是,用户可以关闭表单,如果在不幸的时间发送事件,程序可能会崩溃。 所以,我想我会简单地覆盖窗体的Dispose()方法,在锁定代码中将布尔值设置为true,并检查布尔值并在锁定代码中调用事件。 但是,每次关闭表单时,程序都会完全冻结。 以下是代码中提到的部分: private object dispose_lock = new object(); private bool _disposed = false; private void update(object sender, EventArgs e) { if (InvokeRequired) { EventHandler handler = new EventHandler(update); lock (dispose_lock) { if (_disposed) return; Invoke(handler); // this is where it crashes without using the lock } return; } label.Text = […]

有没有理由锁定除new object()之外的东西?

object theLock = new object(); … lock (theLock) { … } 我总是使用一个new object() ,但我想知道:在任何情况下你会锁定一个更具体的类型?