gpt4 book ai didi

c++ - 在通用 lambda 表达式的所有实例之间共享的局部静态变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:29 28 4
gpt4 key购买 nike

我有一些代码,其中非泛型 lamba 表达式具有局部静态变量:关键部分的互斥体。可以简化为:

int i = 0;
auto lambda = [&i](int &v)
{
static std::mutex mutex;
std::lock_guard<std::mutex> lock(mutex);
/* critical section with v and i */};
}

现在,在这个 lambda 表达式中实现的关键部分可以逐字重复用于除 int & 以外的其他类型,我希望进行一个简单的更改,将 int 替换为auto 在声明符中,像这样:

auto lambda = [&i](auto &v)

不幸的是,如果我这样做,lambda(int&)lambda(float&) 将不再共享相同的局部静态变量,这将破坏锁定关键部分。

满足所有这些要求的代码中最简单的更改是什么:

  • 提供我需要的通用性;和
  • 确保我在关键部分的所有实例中共享一个互斥体;和
  • 不将互斥量暴露给公众查看

一个可行的解决方案是将 lambda 表达式替换为具有模板方法的类,如下所示:

class Lambda
{
public:
Lambda(int &i) : i_(i) {}
template<class V>
void operator()(V &v)
{
std::lock_guard<std::mutex> lock(mutex_);
/* critical section with v and i_ */
};
private:
static std::mutex mutex_;
int &i_;
};
std::mutex Lambda::mutex_;

int i = 0;
Lambda lambda(i);

这会起作用(带有像私有(private)引用 i_ 这样的注意事项),但与初始的 lambda 表达式相比它看起来非常麻烦。有什么更直接的吗?

最佳答案

您可以初始化捕获一个 shared_ptr,这类似于将其定义为闭包类型的成员变量,因此闭包对象的所有拷贝将共享相同的互斥量:

  auto lambda = [&i, m = std::make_shared<std::mutex>()](auto &v)
{
std::lock_guard<std::mutex> lock(*m);
/* critical section with v and i */
};

关于c++ - 在通用 lambda 表达式的所有实例之间共享的局部静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610837/

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