问题标签 [rwlock]

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 投票
1 回答
335 浏览

linux-kernel - 如果 copy_to_user 处于 RW 锁定状态会怎样?

我在读写锁中实现了 copy_to_user() 。我的问题是,如果在执行 copy_to_user 时出现页面错误,即使没有释放锁,它也会得到服务吗?如果没有,我怎样才能做到这一点?任何想法都会非常感激。

谢谢!

0 投票
1 回答
63 浏览

pthreads - pthreads rwlocks 数量的实际限制?

我正在编写一个应用程序,该应用程序要求给定用户的某些活动不会被可能的竞争线程踩踏。我的整个用户数据库都在内存中,我正在考虑向pthread_rwlock_t用户数据结构添加一个。我预计用户不会超过 10 到 2 万。锁结构的 56 字节根本不是很多 RAM。我的问题是,您在一个进程中可以拥有的实际 rwlock 的数量是否存在实际限制?请注意,我不是在谈论可以获得锁的线程数,或者给定线程可以增加锁计数器的次数。相反,我想知道是否有一些底层内核或其他资源支持我可能最终耗尽的每个单独的锁。

0 投票
1 回答
1167 浏览

hashmap - 试图从 RwLock 返回引用,“借来的值不够长”错误

我最近一直在做我的第一个 Rust 项目,但遇到了障碍。我正在使用s 到整数的HashMap映射。受a 保护以允许并发访问。我希望能够返回对. 我在下面复制了一个最小的示例,并将相同的示例放在 Rust 操场StringAtomicUsizeHashMapRwLockAtomicUsizeHashMapRwLockWriteGuardborrowed value does not live long enough

我得到的错误发生在线:

并且是因为借来的价值的寿命不够长。我已经阅读了其他一些讨论此错误的帖子,尤其是这一篇特别相关。读完之后,我可以收集到从互斥锁返回的值的生命周期必须小于互斥锁的生命周期,这似乎完全排除了我正在尝试做的事情。我明白为什么这是不可能的,因为如果我们有一个指向 Hashmap 的指针,而另一个将值插入到互斥体中导致它被调整大小,那么我们将有一个悬空指针。

那么,我的问题是双重的。首先,我只是好奇我是否正确理解了这个问题,或者是否还有其他原因导致我被禁止做我试图做的事情?我的第二个问题是,如果没有Box原子整数并将它们存储在HashMap? 这种方法似乎对我有用,因为我们可以返回一个指向Boxed始终有效的值的指针。然而,这种方法似乎效率低下,因为它需要额外的指针间接层和额外的分配。谢谢!

0 投票
2 回答
96 浏览

c++ - 这个 rwLock 实现有问题吗?

我的程序死锁了,我不知道为什么,因为当我在调试器中运行它时它不会这样做,所以我的第一个怀疑是我的 rwLock,我编写了自己的版本,因为我只想使用标准库 - - 我认为直到 C++17 才包含 rwLock - 这不是我通常做的事情。

0 投票
1 回答
1009 浏览

multithreading - 获取 RwLock 进行读取并将其保持在范围之外

我有一个定期调用回调函数的线程。根据状态,回调函数应获取RwLock与其他线程共享的资源,并保持资源锁定,即使超出回调函数的范围。然后它应在稍后的回调周期中再次根据状态再次释放资源。

我的想法是将Option<RwLockReadGuard<T>>一个结构放入一个结构中,None当资源未锁定和Some(RwLockReadGuard<T>)资源被锁定时。

不幸的是,我无法完成这项工作。我必须设置包含Option<RwLockReadGuard<T>>回调函数线程外部的结构。即使在将结构移入线程时Optionis None,编译器也不会让我通过该选项,因为the trait bound ``std::sync::RwLockReadGuard<'_, T>: std::marker::Send`` is not satisfied.

也许一些代码。我希望它足够自我解释。

0 投票
1 回答
391 浏览

c - Pthread:rwlockattr 的工作原理

我有一个关于“rwlocks”的问题,特别是关于“rwlockattr”的问题。

我有一个链接列表,其中有几个线程正在使用。此列表中的每个成员都有一个“rwlock”。所以现在我想设置一个规则来确保想要访问写锁的线程具有更高的优先级。我的意图是使用

int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr,int pref);

所以现在我的问题;我是否需要为链接列表中的每个“rwlock”初始化一个“rwlockattr”,或者是否足以设置一个全局“rwlockattr”,初始化它并设置“PTHREAD_RWLOCK_PREFER_WRITER_NP”规则?

问候

0 投票
1 回答
36 浏览

c++ - 多个线程中的周期性读锁可能会长时间完全停止写线程吗?

假设有 4 个读取器线程,写入器线程开始工作。它停止了,因为有 4 个阅读线程。当第一个读取线程完成一个迭代时,它会启动另一个,并调用 read_lock()。写入线程仍在等待,因为有 3 个读取线程。由于没有写入线程,因此第一个读取线程开始另一个迭代,依此类推......这是否意味着所有 4 个线程很可能会完成 1000000 次的工作,并且只有在那个写入线程开始工作之后?

0 投票
0 回答
263 浏览

rust - 每个块具有单独 RwLock 的结构数组

我正在尝试创建一个包含多个字节块的结构,其中每个字节块都保存在一个单独的RwLock.

这适用于性能非常重要的体素引擎。每个字节块都需要由多个线程读取/写入。需要多个RwLocks,这样只有一个特定的块将被锁定,其余的块可以自由地被其他线程读取/写入;锁定整个结构将导致锁定所有正在执行工作的线程。

大多数其他结构将被分配一个特定的插槽,字节块需要堆栈分配。

编译器抱怨它不能复制RwLocks 因为没有Copy特征 on RwLock,我不想复制但 instance multiple RwLocks

主线程产生一个子线程,它将保存所有游戏/核心数据,并且可以通过子线程将产生的每个工作线程访问。

Block每个工作线程都将被分配工作负载以在 上分配的数据上读取/写入数据Stacks,但我不知道如何在RwLocks不使用集合的情况下以这种方式或任何其他方式实例化多个。

我尝试#[derive(Copy, Clone)]为每个结构添加,但Bytes结构错误是:

我猜RwLock大小在编译时无法知道,那么指向每个字节块的指针向量是否有效?如果是这样,我该如何安全地实施呢?

0 投票
2 回答
1608 浏览

rust - 独立于方法返回 RWLockReadGuard

我有一个类型的对象

我有一种方法应该参考SessionData

我正在使用 Rocket(Rust 的网络框架),我不能直接调用该方法,因为它是由 Rocket 调用的。但是,我可以为它提供一个实现,该实现创建将传递给处理程序的对象。它看起来有点像这样:

我想避免RwLock直接返回一个,因为我希望处理程序将一个已经锁定的对象传递给它。但是,我不能返回引用或 a RwLockReadGuard,因为它们都依赖于RwLock,这将超出范围。

相反,我正在尝试创建某种自给自足的类型,该类型将包含一个Arc<RwLock<SessionData>>,包含对该锁的锁定保护,并取消对一个SessionData对象的引用。

到目前为止,我已经尝试了以下一些组合:

  • Session包含 anArc<RwLock<SessionData>>和 a的对象RwLockReadGuard<SessionData>
  • 包含来自owning-ref库的 anArc<RwLock<SessionData>>和 a的对象。RwLockReadGuardRef<SessionData>
  • 将使用OwnedHandle来自owning-ref库的类型的对象。

然而,我一直没能做我想做的事,遇到各种终生借贷问题等等。

是否有可能创建一种自包含的类似“句柄”的对象,该对象将同时包含它指向的对象的锁和锁守卫?

这与如何返回对位于互斥锁下的值的子值的引用中描述的情况类似,但略有不同?. 在那里,MutexGuardRef内部依赖于,如果(or ) 超出范围Mutex,则不存在。为了实现类似的行为,我必须传递一个包含 my 的结构,然后在方法内部进行锁定。这很好,但我想知道我是否可以更进一步,并传递一个既独立又用作a 的结构,从而避免手动锁定的需要。MutexMyStructRwLockRwLockGuard

基本上,我想将锁定RwLock从客户端移动到值的提供者。

0 投票
1 回答
777 浏览

locking - 实现写优先读/写锁

我有一个互斥库,并且正在尝试实现一个写优先锁。我正在看这个例子:

https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

我了解读优先锁,但我不了解写优先锁。有人可以解释如何实现吗?

具体来说,我不明白这部分:

我也不明白这个标志w是通用的,还是每个进程只是一个不同的标志。我猜是前者。

例如,这里我们看到了获取读锁的算法:

但这是什么wait c, m意思?这不能意味着等待同时锁定cm,因为我们已经m在步骤 1 中锁定了。

而且,对于Set w to true- 这是否意味着w必须在所有流程或仅此流程中设置为 true?