Questions tagged «mutex»

互斥锁(“互斥”)是一种机制,当从多个线程同时访问(特别是更改)相同的数据或资源时,可以确保完整性。


30
创建单实例WPF应用程序的正确方法是什么?
在.NET(而不是Windows Forms或控制台)下使用C#和WPF ,创建只能作为单个实例运行的应用程序的正确方法是什么? 我知道它与某种称为互斥体的神话事物有关,我很少能找到一个烦人的人来阻止并解释其中的一个。 该代码还需要告知已经运行的实例用户试图启动第二个实例,并且还可能传递任何命令行参数(如果存在)。
656 c#  .net  wpf  mutex 



8
在C#中使用Global Mutex的良好模式是什么?
Mutex类非常容易被误解,而全局互斥体更是如此。 创建全局互斥锁时,可以使用哪种良好,安全的模式? 一个会起作用的 无论我的机器位于哪个区域 保证正确释放互斥锁 如果没有获取互斥,可以选择不永久挂起 处理其他进程放弃互斥锁的情况
377 c#  concurrency  mutex 



7
递归锁(Mutex)与非递归锁(Mutex)
POSIX允许互斥量是递归的。这意味着同一线程可以锁定同一互斥锁两次,并且不会死锁。当然,它还需要将其解锁两次,否则其他线程将无法获得该互斥锁。并非所有支持pthread的系统都支持递归互斥锁,但是如果要符合POSIX,则必须这样做。 其他API(更高级的API)通常也提供互斥体,通常称为“锁定”。某些系统/语言(例如Cocoa Objective-C)提供递归和非递归互斥体。有些语言也只提供其中一种。例如,Java互斥锁始终是递归的(同一线程可能在同一对象上两次“同步”两次)。根据它们提供的其他线程功能的不同,不使用递归互斥可能没有问题,因为可以很容易地自己编写(我已经在更简单的互斥/条件操作的基础上实现了递归互斥)。 我不太了解的是:非递归互斥锁有什么用处?如果两次锁定同一个互斥锁,为什么还要线程死锁?即使是可以避免这种情况的高级语言(例如,测试是否会死锁并在发生异常时抛出异常)通常也不会这样做。他们会让线程死锁。 这是否仅适用于以下情况:我不小心将其锁定两次,而仅将其解锁一次,并且在递归互斥的情况下,将很难发现问题,因此我立即使其死锁,以查看错误的锁定出现在何处?但是在解锁时返回锁计数器是否可以做同样的事情,在这种情况下,我确定我释放了最后一个锁并且计数器不为零,我可以抛出异常或记录问题吗?还是我没有看到其他任何更有用的非递归互斥用例?还是仅仅是性能,因为非递归互斥锁可能比递归互斥锁快一点?但是,我对此进行了测试,但差异实际上并没有那么大。


1
Mutex示例/教程?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使它成为Stack Overflow 的主题。 4个月前关闭。 改善这个问题 我是多线程的新手,并试图了解互斥锁的工作原理。做了很多谷歌搜索,我发现了一个不错的教程,但是它仍然对它的工作方式产生了一些疑问,因为我创建了自己的程序,其中锁不起作用。 互斥锁的一种绝对不直观的语法pthread_mutex_lock( &mutex1 );是,当我真正想要锁定的是其他变量时,它看起来像互斥锁已被锁定。这种语法是否意味着锁定互斥锁会锁定代码区域,直到互斥锁解锁为止?那么线程如何知道该区域已锁定?[ 更新:线程知道该区域已被 Memory Fencing 锁定 ]。难道这种现象不应该称为临界区吗?[ 更新:关键部分对象仅在Windows中可用,其中这些对象比互斥对象快,并且仅对实现该对象的线程可见。否则,关键部分仅指由互斥锁保护的代码区域 ] 简而言之,能否请您提供最简单的互斥体示例程序以及有关其工作原理的最简单的解释?我确信这将对其他许多新手有所帮助。


7
用c ++ 11等效项替换boost :: thread和boost :: mutex是否明智?
动机:我正在考虑的原因是,我的天才项目经理认为boost是另一种依赖,并且它很可怕,因为“您依赖它”(我试图解释boost的质量,然后过了一段时间就放弃了:( )。我之所以愿意这样做的较小原因是我想学习c ++ 11的功能,因为人们将开始在其中编写代码。 #include<thread> #include<mutex>和Boost等价物之间是否存在1:1映射? 您是否认为用c ++ 11的 东西代替boost的东西是个好主意?我的用法是原始的,但是有没有一些示例说明std不提供什么功能呢?或(亵渎)反之亦然? PS我使用GCC,所以标题在那里。

5
.NET Framework中并发HashSet <T>?
我有以下课程。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } 我需要从不同的线程更改字段“数据”,所以我想对当前的线程安全实现提出一些意见。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 有没有更好的解决方案,可以直接进入现场并保护它免受多个线程的并发访问?

5
锁定未锁定的互斥锁的效率如何?互斥锁的成本是多少?
在低级语言(C,C ++或任何其他语言)中:我可以选择是否拥有一堆互斥对象(例如pthread给我的东西或本机系统库提供的东西)或一个对象的单个对象。 锁定互斥锁的效率如何?即可能有多少个汇编程序指令,它们需要多少时间(在互斥锁未锁定的情况下)? 互斥锁的成本是多少?确实有很多互斥体是一个问题吗?还是我可以在代码中抛出与变量一样多的互斥量int变量,这并不重要吗? (我不确定不同的硬件之间有多少区别。如果有,我也想知道它们。但是大多数情况下,我对通用硬件很感兴趣。) 关键是,通过使用许多互斥量(每个互斥量仅覆盖对象的一部分)而不是整个对象的单个互斥量,我可以保护很多块。我想知道我应该走多远。即我应该尽可能真正地保护任何可能的块,无论这意味着多少复杂和多少互斥量? WebKits博客文章(2016)中有关锁定的问题与该问题非常相关,并解释了自旋锁,自适应锁,futex等之间的区别。

9
返回语句应该在锁的内部还是外部?
我只是意识到在代码的某些地方,return语句位于锁内部,有时位于外部。哪一个是最好的? 1) void example() { lock (mutex) { //... } return myData; } 2) void example() { lock (mutex) { //... return myData; } } 我应该使用哪一个?
142 c#  .net  multithreading  mutex 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.