【问题标题】:Do C++ classes solve function overwriting?C++ 类能解决函数覆盖问题吗?
【发布时间】:2017-11-09 21:31:46
【问题描述】:

所以我有两个线程在运行,每个线程都调用相同的函数。我遇到了竞争情况,或者函数 SomeFunction 中的值搞砸了。我假设每个线程都没有自己的 SomeFunction 副本,对吗?

DWORD Thread1() {
INT dwA = 4;
SomeFunction(dwA);
}

DWORD Thread2() {
INT dwB = 5;
return SomeFunction(dwB);
}

DWORD SomeFunction(DWORD *dwVal) {
// do some lengthy operations with dwVal here
return dwVal;
}

我的问题是,而不是上面的问题,如果我将 SomeFunction 放在一个类中并在每个线程中创建一个新类,这是否可以解决每个线程调用相同函数并因此踩踏另一个线程的值的问题之前可能调用过 SomeFunction() 吗?每个线程是否在内存中获取自己的 SomeFunction 副本以避免此问题?

class.h:
class CDatabase
{
public:
    CClass();
    ~CClass();   
    DWORD CClass::SomeFunction(DWORD *dwVal);
};


class.cpp
CClass::CClass() {}
CClass::~CClass() {}
DWORD CClass::SomeFunction(DWORD *dwVal) {
// do some lengthy operations with dwVal here
return dwVal;
}

这是我在每个线程中放入的内容吗?

DWORD Thread1() {
INT dwA = 4;
CClass *m_CDatabase = new CClass();
DWORD rv = m_CDatabase->SomeFunction(dwA);
delete m_CDatabase;
return rv;
}

DWORD Thread2() {
INT dwA = 5;
CClass *m_CClass = new CClass();
DWORD rv = m_CClass->SomeFunction(dwA);
delete m_CClass;
return rv;    
}

如果我不够清楚,请告诉我。

【问题讨论】:

  • 类在竞争条件方面没有任何变化
  • 也许“种族”不是我应该使用的正确词。
  • 编译时启用所有警告并将它们视为错误。如果您的代码 sn-ps 表示任何内容,那么您忘记了一个 & 符号,例如 SomeFunction(&dwA)
  • 两个线程运行相同的代码不是问题。两个线程在没有适当同步的情况下对同一数据进行操作是一个问题。
  • new/delete 也是代码异味。多线程?您可能想回到书中的几章。但如果你是从一本书中学习到这种风格,那本书就会有点可疑。

标签: c++ multithreading class thread-safety


【解决方案1】:

两个线程将运行相同的代码(代码是共享的)。

但是每个线程都有自己的私有局部变量集。所以线程不会改变其他线程使用的变量(如果变量是函数的本地变量)。现在,如果变量是全局的,那么所有的赌注都没有了。

将其更改为使用类绝对不会产生任何影响。函数的局部变量(以及对象的局部变量)不会在线程之间共享。但全局变量仍将被共享。

还有第三种类型的变量(除了本地(自动存储持续时间)、全局(静态存储持续时间))。这第三种类型是线程本地的(线程存储持续时间)。这些就像全局变量(它们不是函数或对象的局部变量),但每个线程都有自己的变量副本(因此它们不像全局变量那样交互),但它们不是函数或对象的局部变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2015-09-19
    相关资源
    最近更新 更多