Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 互斥锁只能从等待它的同一线程中释放?_C#_Multithreading_Mutex - Fatal编程技术网

C# 互斥锁只能从等待它的同一线程中释放?

C# 互斥锁只能从等待它的同一线程中释放?,c#,multithreading,mutex,C#,Multithreading,Mutex,是否只有等待互斥锁的线程才能释放互斥锁?如果是,为什么互斥锁的行为是这样的?那么为什么我们说互斥可以跨多个进程工作呢?什么是命名互斥和未命名互斥?我真的很困惑这个问题 如果我想在一个线程中等待互斥并从另一个线程发出信号,我该怎么办?互斥信号必须由获得互斥信号的同一个线程释放。这就是它们的工作方式:单个线程获取资源上的锁,以便可以对其进行操作,然后在完成时释放该锁,以便其他线程可以对其进行锁定 “互斥”位的全部要点是,带有锁的线程具有总的能力-只有它才能释放该锁。这仍然允许互斥体跨多个线程工作,因

是否只有等待互斥锁的线程才能释放互斥锁?如果是,为什么互斥锁的行为是这样的?那么为什么我们说互斥可以跨多个进程工作呢?什么是命名互斥和未命名互斥?我真的很困惑这个问题


如果我想在一个线程中等待互斥并从另一个线程发出信号,我该怎么办?

互斥信号必须由获得互斥信号的同一个线程释放。这就是它们的工作方式:单个线程获取资源上的锁,以便可以对其进行操作,然后在完成时释放该锁,以便其他线程可以对其进行锁定

“互斥”位的全部要点是,带有锁的线程具有总的能力-只有它才能释放该锁。这仍然允许互斥体跨多个线程工作,因为它可以在其生命周期中由其中任何一个线程拥有

命名互斥体允许单个互斥体跨进程和线程工作。该名称用于允许单独的进程“连接”到已创建的互斥体,然后可用于控制跨所有连接进程对资源的访问


对于您所希望的跨线程通信,您看到的是一个类似于条件变量的东西,它用于向线程发出条件已满足的信号-我认为.Net中的等价物是监视器及其等待和脉冲方法。

互斥锁拥有所有权-请参阅paxdiablo post。如果您想在一个线程中等待某个线程并从另一个线程发出信号,请不要使用互斥锁!事件-正常,condvar正常,监视器正常,信号量正常,事件正常,互斥不正常

Rgds,
Martin

简单的回答是,当释放互斥锁时(从拥有互斥锁的线程),将通知其他线程

i、 e.所有在互斥体上等待的线程将争夺互斥体的所有权,获胜者将从等待调用返回并继续执行互斥体的所有权

这就是使用互斥和自己协调信号的区别。 这回答了你的问题还是我误解了你


Daniel

除了获取互斥对象的线程外,您不能从任何其他线程发出互斥对象(Mut-ualEx-clusion内核同步构造)的信号。

您是指
互斥对象类吗?必须清楚,因为互斥是一个通用概念,
System.Threading.mutex
是其具体实例。文档提供了一个很好的用法描述,请参见:另请参见这个问题,以了解C#中关于条件变量的更多信息:“互斥”位的全部要点是,带有锁的线程具有总能力-只有它可以释放该锁。请参见“这要求一个线程获取的互斥可以被另一个线程释放。”你是说这篇文章的作者不称职吗@安德鲁,不是无能,只是在术语上松懈。如果您允许另一个线程解锁互斥锁,它将失去保护共享资源的能力。互斥的确切含义是:这个资源是我的,走开,在我用完它之前你不能拥有它。可能存在允许外部方代表您发布的同步原语,但我认为它们不应该称为互斥体,而应该称为
mut