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

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

尽管这些缓冲区仅用于临时对象,但我需要控制它们的生命周期,构造/销毁线程等。而且我不希望从调用站点提供这些临时对象,因为它们的使用只是“功能”的内部。因此,我认为那些“功能”需要按照类来实现(而不是具有/不具有静态变量的功能)。

由于没有外部可见的状态变化(尽管存在状态,在构造后不会改变),所以我认为最好用const限定函数(我是说,函数调用运算符或其他函数)。但是然后我不确定如何处理这些临时资源的线程安全性,因为众所周知,在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/

10-11 23:10
查看更多