C++ 隔离类的并发/非并发可访问数据成员

C++ 隔离类的并发/非并发可访问数据成员,c++,multithreading,concurrency,C++,Multithreading,Concurrency,我有一个类,我们称它为MainThread,它将通过一个非阻塞的主线程来调用。现在这个类必须执行一些它委托给第二个类的任务,让我们调用它AsycnThread。现在AsyncThread实际上什么都不做,只调用类MainThread的一些函数。这意味着可以同时访问MainThread的一些成员。因为我想避免任何锁,所以我设计了类MainThread,使它的一些成员可以并发访问而不会出现任何问题,而有些成员是专门禁止访问的。这里还有一个细节,类MainThread有一个特定的函数classedpe

我有一个类,我们称它为
MainThread
,它将通过一个非阻塞的主线程来调用。现在这个类必须执行一些它委托给第二个类的任务,让我们调用它
AsycnThread
。现在
AsyncThread
实际上什么都不做,只调用类
MainThread
的一些函数。这意味着可以同时访问
MainThread
的一些成员。因为我想避免任何锁,所以我设计了类
MainThread
,使它的一些成员可以并发访问而不会出现任何问题,而有些成员是专门禁止访问的。这里还有一个细节,类
MainThread
有一个特定的函数classed
performTask
,它是从
asynchthread
调用的

在这种背景下,我的目标是使这段代码尽可能可维护。现在,为了区分
main线程的数据成员
,我使它们可变,并使函数
performTask const
。现在,如果我试图访问在
performTask
中并发使用不安全的任何数据成员,编译器将报告一个错误。下面是该类的骨架结构

class MainThread {
public:
// Will be called asynchronously
void performTask() const;

private:
// Non concurrent data members
std::vector<int> data_store;
// Concurrently accessed data member
mutable CachedVec cache;
}
class主线程{
公众:
//将异步调用
void performTask()常量;
私人:
//非并发数据成员
std::矢量数据存储;
//并发访问的数据成员
可变缓存;
}
这似乎是一个好方法吗?是否有其他方法可以实现类似的目标?

1)易变成员功能 2) 锁定用于互斥体获取/释放功能的PTR模板

查找更多详细信息@

1)易失性成员函数 2) 锁定用于互斥体获取/释放功能的PTR模板

查找更多详细信息@

我喜欢这个解决方案,但是它感觉它与
const
方法和
mutable
变量的真正目的相矛盾…@AlexLop。是的,你是对的。这就是为什么我对使用这种方法有点担心。我希望其他开发人员能够提供一种更全面的方法来解释为什么这种方法是错误的。我不认为这是一种糟糕的或真正错误的方法,只是有点让人困惑。是否有一个选项可以使
performTask()
全局和所有
可变的
变量
public
或private,但可以通过公共访问器(set/get)访问它们?这很混乱,因为它不符合约定,也不适用于您正在使用的构造。因此,代码可能会让除您之外的任何维护人员头疼。相反,我只是将线程安全方法从MainClass庞然大物中移开,只声明MainClass单线程。我喜欢这种解决方案,但它感觉与
const
方法和
mutable
变量的真正目的相矛盾…@AlexLop。是的,你是对的。这就是为什么我对使用这种方法有点担心。我希望其他开发人员能够提供一种更全面的方法来解释为什么这种方法是错误的。我不认为这是一种糟糕的或真正错误的方法,只是有点让人困惑。是否有一个选项可以使
performTask()
全局和所有
可变的
变量
public
或private,但可以通过公共访问器(set/get)访问它们?这很混乱,因为它不符合约定,也不适用于您正在使用的构造。因此,代码可能会让除您之外的任何维护人员头疼。相反,我只是将线程安全方法从MainClass庞然大物中移开,只声明MainClass单线程。