gpt4 book ai didi

c++ - 关于 "pure"函数对象的 const 和线程安全

转载 作者:行者123 更新时间:2023-11-30 03:26:29 25 4
gpt4 key购买 nike

在我的程序中,有一些“函数”接受适当的参数,执行一些计算,并返回相应的结果。这些“功能”有一些外部不可见的内部状态;它们主要是临时结果的内存缓冲区。这意味着,那些“功能”没有任何逻辑状态。

这些内存缓冲区和其他东西实际上在每次调用时都在变化,因为所需的缓冲区大小可能会根据输入数据而变化。

虽然这些缓冲区仅用于临时对象,但我需要控制它们的生命周期、构造/销毁线程等。而且我不希望从调用站点提供这些临时对象,因为它们的使用仅在“函数”内部”。所以我认为那些“功能”需要根据类来实现(而不是使用/不使用静态变量的功能)。

因为没有外部可见的状态变化(虽然有些状态是给定的并且在构造后永远不会改变),我认为最好用 常数。但是我不确定我应该如何处理这些临时资源的线程安全性,因为众所周知,在 C++11 中,const 默认表示线程安全。

目前函数的使用主要是单线程;只有在极少数情况下,这些函数的实例才会被多个线程共享,所以我在真正需要的时候从外部锁定了这些调用。 (更准确地说,有一个锁保护着整个计算系列。当另一个线程想要执行计算时,它会获得该锁。目前没有与每个函数关联的锁。)

功能的实现与外部分离,因为我打算在其他项目中使用它们。

在函数实现中使用锁来保护计算是否更好?或者只是保留非常量函数,尽管它们只是(至少在概念上)纯函数?或者只是将它们标记为 const 尽管它们不是线程安全的(所以不是真正的“const”)?或者我应该考虑采用不同的方法吗?

最佳答案

最简单的解决方案是使用thread_local 缓冲区。

int T::myfunction(int arg) const
{
static thread_local U mybuffer;
// impl...
}

thread_local 将为您提供线程安全性,因为每个线程都将使用自己的缓冲区。由于它在函数内部是static,因此在每次函数调用后都会保留缓冲区。

关于c++ - 关于 "pure"函数对象的 const 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296245/

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