问题:-是A类“ str”的受保护类成员是线程安全的吗?当从子类B和C的函数调用函数setString和getString时?
static CRITICAL_SECTION _cs;
class A
{
protected:
tstring str;
public:
A(){
InitializeCriticalSection(&_cs);
}
void setString(PCWSTR gstr)
{
str = gstr;
}
PCWSTR getString()
{
return str.c_str();
}
~A(){
DeleteCriticalSection(&_cs);
}};
Class B : public A
{
public :
PCWSTR temp = obj.randomString(); //assume getting string from some function
EnterCriticalSection(&_cs);
setString(temp);
LeaveCriticalSection(&_cs);
EnterCriticalSection(&_cs);
PCWSTR newStrig = getString();
LeaveCriticalSection(&_cs);
};
class C : public A
{
public :
PCWSTR temp = obj.randomString(); // getting string from some function
EnterCriticalSection(&_cs);
setString(temp);
LeaveCriticalSection(&_cs);
EnterCriticalSection(&_cs);
PCWSTR newStrig = getString();
LeaveCriticalSection(&_cs);
};
通常,如果所有调用它的线程都进行只读操作,则它是线程安全的,否则不是。但是据我所知,它是一个setter函数,因此您存在数据争用的问题。
为了使其具有线程安全性,您可以在您的类中将互斥锁声明为私有成员,然后按如下所示使用它:]
class A
{
private:
std::shared_mutex strMut;
public:
void setString(PCWSTR gstr)//I think this is better to be const and &
{
st::lock_guard<std::shared_mutex>{strMut};
str = gstr;
}
PCWSTR getString()
{
std::shared_lock<std::shared_mutex>{strMut}
return str.c_str();
}
........
};