gpt4 book ai didi

c++ - 如何使用任意字符串作为 C++ 中的锁?

转载 作者:可可西里 更新时间:2023-11-01 17:15:32 25 4
gpt4 key购买 nike

假设我有一个多线程 C++ 程序,它以对 handleRequest(string key) 的函数调用的形式处理请求。对 handleRequest 的每次调用都发生在一个单独的线程中,并且 key 有任意多的可能值。

我想要以下行为:

  • 同时调用 handleRequest(key) 时,它们具有相同的 key 值。
  • 最小化全局序列化。

handleRequest 的主体可能如下所示:

void handleRequest(string key) {
KeyLock lock(key);
// Handle the request.
}

问题:我将如何实现 KeyLock 以获得所需的行为?

一个天真的实现可能像这样开始:

KeyLock::KeyLock(string key) {
global_lock->Lock();
internal_lock_ = global_key_map[key];
if (internal_lock_ == NULL) {
internal_lock_ = new Lock();
global_key_map[key] = internal_lock_;
}
global_lock->Unlock();
internal_lock_->Lock();
}

KeyLock::~KeyLock() {
internal_lock_->Unlock();
// Remove internal_lock_ from global_key_map iff no other threads are waiting for it.
}

...但这需要在每个请求的开始和结束时使用全局锁,并为每个请求创建一个单独的 Lock 对象。如果对 handleRequest 的调用之间的竞争很高,那可能不是问题,但如果竞争很低,它可能会带来很多开销。

最佳答案

您可以做一些与您在问题中所做的类似的事情,但不是单个 global_key_map 有多个(可能在数组或 vector 中)- 使用哪个由字符串上的一些简单哈希函数确定。

通过这种方式,您可以将其分散到多个独立的锁上,而不是单个全局锁。

这是内存分配器中经常使用的模式(我不知道该模式是否有名称 - 应该有)。当一个请求进来时,一些东西决定了分配来自哪个池(通常是请求的大小,但其他参数也可以考虑在内),然后只需要锁定那个池。如果分配请求来自另一个将使用不同池的线程,则不会发生锁争用。

关于c++ - 如何使用任意字符串作为 C++ 中的锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/168249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com