Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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_Thread Safety - Fatal编程技术网

C++ 锁、互斥和关键部分之间的区别

C++ 锁、互斥和关键部分之间的区别,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,关于互斥和临界区之间的区别存在一个问题,但它也不处理锁 所以我想知道关键部分是否可以用于进程之间的线程同步 同时,有信号状态和无信号状态的含义也在进行中。命名互斥体可以跨进程使用 锁是一个通用术语,因此我不知道你指的是哪个平台。例如,在C#中,锁原语是一个关键部分。在Windows中,关键部分(大部分)是在用户模式下实现的,互斥锁将上下文切换到内核模式(速度较慢)。如果线程在拥有互斥体时终止,则称该互斥体已被放弃。互斥体的状态设置为signaled,下一个等待的线程获得所有权。在与临界段相同的情

关于互斥和临界区之间的区别存在一个问题,但它也不处理锁

所以我想知道关键部分是否可以用于进程之间的线程同步


同时,有信号状态和无信号状态的含义也在进行中。命名互斥体可以跨进程使用


锁是一个通用术语,因此我不知道你指的是哪个平台。例如,在C#中,锁原语是一个关键部分。

在Windows中,关键部分(大部分)是在用户模式下实现的,互斥锁将上下文切换到内核模式(速度较慢)。如果线程在拥有互斥体时终止,则称该互斥体已被放弃。互斥体的状态设置为signaled,下一个等待的线程获得所有权。在与临界段相同的情况下,所有其他线程将保持阻塞状态。无法命名关键部分,因此无法使用它们来同步多个进程。

1)关键部分是用户和联锁操作之间的桥梁。它使用inetrlocked交换操作来锁定和解锁线程。它比互斥锁工作得更快


2) 互斥是一个内核对象。它工作不快,但有一些优点。首先,命名互斥体可以跨进程使用。其次,如果线程被终止,那么由该线程锁定的互斥锁将被解锁。

关键部分不是内核对象。它们没有任何手柄标识。它们只能用于同步属于同一进程的线程。它们不能用于整个进程的同步

CSingleLock(我假设您在本文中将其称为锁)是一个使用概念的包装器类。它帮助您获取线程同步对象(在其构造函数中),并以一种简单的方式调用锁定和解锁API。(隐藏正在使用的同步对象的所有内部详细信息)

CSingleLock在与关键部分一起使用时,不能跨流程使用。其中as互斥可以用于此目的

当一个线程获取互斥体而没有其他线程可以获取互斥体时,互斥体的状态被称为处于非签名状态。
如果互斥锁可用,但没有线程获得,则它处于已签名状态。

我认为它们是一样的,我猜您使用的是一个库,它在三者之间产生了一些差异(Win32?)。您是说像CSingleLock这样的锁在跨进程执行线程时也支持线程同步吗。我以为只有互斥体支持这一点。如果我错了,请纠正“关键部分在用户模式下完全实现”