来自子类的EnterCriticalSection

问题描述 投票:0回答:1

问题:-是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);

};
c++ multithreading concurrency com entercriticalsection
1个回答
0
投票

通常,如果所有调用它的线程都进行只读操作,则它是线程安全的,否则不是。但是据我所知,它是一个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();
    }


    ........
};
© www.soinside.com 2019 - 2024. All rights reserved.