【发布时间】: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