问题标签 [mutex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
282 浏览

c++ - 堆栈对象的 C++ 继承

我有一个基类,令牌。它没有实现,因此充当标记接口。这是调用者将使用的类型。

我有一个派生类 LockToken。它包裹了一个互斥体,并确保在构造过程中获取锁并在销毁过程中释放锁。startJob 方法在某种意义上是工厂方法,它决定是返回 Token(不提供锁定)还是 LockToken(提供锁定)。

当 startJob 将返回一个基本实例(一个令牌)时,一切正常。在另一种情况下(jobId>0),将派生实例复制到基本实例。在其他工作中,从 LockToken 复制构造了一个不同的 Token,原始 LockToken 过早地超出范围,释放 startJob 范围内的锁。

我该如何摆脱困境?我可以更改 startJob 以使其返回或输出真正的协变令牌(意味着它可能是 LockToken)?

0 投票
2 回答
961 浏览

winapi - Win32互斥锁不等待

我正在创建一个实现进程间通信的应用程序。为此,我设置了一个共享缓冲区,它似乎工作正常。现在,我需要一种方法让数据生成应用程序(用 c++ 编写)告诉数据接收应用程序(用 freepascal/lazarus 编写)何时应该读取数据。

我试图为此目的使用互斥锁。我对windows api编程没有太多经验。

所以,我的问题是,在下面的 FreePascal 代码中,互斥锁不会等待。我可以调用 TMutex.Wait() 函数,它不会返回错误或任何东西,但它根本不会等待。

构造函数 TMutex.Create(sName: AnsiString);
开始
  sName := 'Local\Mutex'+sName;
  hMutex := CreateMutexA(
        nil, // 默认访问
        True, // 最初不拥有
        PChar(sName)); //
  如果 hMutex = 0 则命名为互斥体 然后
  开始
    raise Exception.Create('互斥体创建失败');
  结尾;
结尾;

析构函数 TMutex.Destroy;
开始
  关闭句柄(hMutex);
结尾;

程序 TMutex.Wait;
开始
  if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('debug: wait returned something');
结尾;

程序 TMutex.Post;
开始
  ReleaseMutex(hMutex);
结尾;

0 投票
6 回答
8014 浏览

multithreading - 什么时候无锁数据结构的性能低于互斥(互斥体)?

我在某处(再也找不到该页面)读到无锁数据结构“对于某些工作负载”更有效,这似乎意味着有时它们实际上速度较慢,或者在某些情况下它们的收益可能为零。对我来说,使用锁定指令的约 100 个周期来执行原子操作听起来比进入睡眠状态并等待调度程序唤醒进程备份要快得多,所以在什么情况下无锁数据结构对我来说并不明显不如老式的互斥锁更可取。如果锁在 99% 的时间内都可用并且进程不必进入睡眠状态,那么互斥锁会更快吗?假设有合适的无锁数据结构可用,是否有一个好的经验法则可以知道该走哪条路?

0 投票
4 回答
3929 浏览

c++ - 只写互斥锁

我有一个多线程 C++ 应用程序,它在内存中保存一个复杂的数据结构(缓存数据)。

当我刚刚读取数据时,一切都很好。我可以拥有任意数量的线程来访问数据。

然而,缓存的结构不是静态的。

  • 如果请求的数据项不可用,它将从数据库中读取,然后插入到数据树中。这可能也没有问题,即使我在将新数据项添加到只需要几个周期的树中使用互斥锁(它只是添加一个指针)。
  • 有一个不时执行的垃圾收集过程。它从树中删除所有旧项目。为此,我需要锁定整个事情以确保当前没有其他进程正在访问任何将从内存中删除的数据。当我从缓存中读取数据时,我还必须锁定树,这样我就不会在处理项目时删除它们(有点“相反的事情”)。

“伪代码”:

困扰我的是:这意味着,我必须在阅读时锁定树(以避免在阅读时开始垃圾收集)。但是 - 作为副作用 - 我也不能同时拥有两个阅读过程。

有什么建议么?

是否有某种“这是一个只读操作,只与写入冲突”互斥锁?

0 投票
5 回答
2979 浏览

c++ - 互斥锁的存在是否有助于摆脱 volatile 关键字?

我有一个多 R/W 锁类,它保持读、写和挂起的读、挂起的写计数器。互斥体保护它们免受多个线程的影响。

我的问题是我们是否仍然需要将计数器声明为 volatile 以便编译器在进行优化时不会搞砸它。

或者编译器是否考虑到计数器由互斥锁保护。

我知道互斥锁是一种用于同步的运行时机制,而“volatile”关键字是编译时指示编译器在进行优化时做正确的事情。

问候,-杰。

0 投票
1 回答
124 浏览

multithreading - 如何检查线程管理初始化是否完成?

我正在开发一个类,可以在调用 main() 之前对其进行实例化。我有一个受互斥锁保护的关键部分是代码。不幸的是,应用程序在 AIX 上失败,因为代码在线程初始化之前被调用。我想在代码中添加一个检查以避免线程未准备好时的互斥锁,并在线程初始化后使用锁定。

我使用 IBM XL C/C++ v.8.0 在 AIX 5.3 上工作

0 投票
2 回答
1604 浏览

multithreading - “benaphores”值得在现代操作系统上实施吗?

回到我作为 BeOS 程序员的日子里,我读了 Benoit Schillings 的这篇文章,描述了如何创建一个“Benaphore”:一种使用原子变量来强制执行关键部分的方法,从而避免了在常见的情况下获取/释放互斥锁的需要(无争用)情况。

我认为这相当聪明,而且您似乎可以在任何支持原子增量/减量的平台上执行相同的技巧。

另一方面,这看起来可以很容易地包含在标准互斥锁实现本身中......在这种情况下,在我的程序中实现这个逻辑将是多余的并且不会提供任何好处。

有谁知道现代锁定 API(例如 pthread_mutex_lock()/pthread_mutex_unlock())是否在内部使用这个技巧?如果没有,为什么不呢?

0 投票
5 回答
14323 浏览

pthreads - pthreads:来自临界区的 pthread_cond_signal()

我在线程A中有以下代码,它使用pthread_cond_wait()

我在线程 B 中有以下代码,它向线程 A 发出信号

pthread_cond_signal(&my_wait)如果没有其他线程,如果移出关键部分块,如下所示会有什么不同吗?

0 投票
5 回答
9137 浏览

windows - Are mutexes really slower?

I have read so many times, here and everywhere on the net, that mutexes are slower than critical section/semaphores/insert-your-preferred-synchronisation-method-here. but i have never seen any paper or study or whatever to back up this claim.

so, where does this idea come from ? is it a myth or a reality ? are mutexes really slower ?

0 投票
6 回答
5284 浏览

language-agnostic - 如何跨网络互斥?

我有一个在网络上运行的桌面应用程序,每个实例都连接到同一个数据库。

那么,在这种情况下,如何实现一个可在所有连接到同一数据库的正在运行的实例中工作的互斥锁?

换句话说,我不希望这两个以上的实例同时运行相同的功能。如果一个已经在运行该函数,则其他实例不应访问它。


PS:数据库事务不会解决,因为我不想互斥的功能不使用数据库。我提到数据库只是因为它可以用来在运行的实例之间交换信息。

PS2:该功能大约需要 30 分钟才能完成,所以如果第二个实例尝试运行相同的功能,我想显示一条很好的消息,它现在无法执行,因为计算机“X”已经在运行该功能.

PS3:该函数必须在客户端机器上处理,所以我不能使用存储过程。