1

在我的课堂上,我使用该CreateThread(NULL,0,Execute1,this...)方法创建了一个线程。

DWORD WINAPI Execute1(LPVOID lpParam) {
CoInitialize(NULL);
CVC1Dlg *pdlg=(CVC1Dlg *) lpParam;

然后我从这个线程调用 pdlg 方法:

pdlg->someMethod();

当我从这个线程调用这个方法时,如果这个方法同时从主线程调用,会发生什么?我应该使用像互斥锁这样的同步方法吗?我到底需要在哪里调用互斥锁?

我必须在 CVC1Dlg 方法中使用它是否正确?像这样的东西:

CVC1Dlg ::CVC1Dlg () {
  g_hMutex=CreateMutex(...)
}

void CVC1Dlg ::setStatus(int aStatus) {
  ::WaitForSingleObject(g_hMutex, INFINITE);
  iStatus=aStatus;
  ::ReleaseMutex(g_hMutex);
}
4

2 回答 2

0

发生了什么,当我从这个线程调用这个方法时,如果这个方法同时从主线程调用。我应该使用诸如互斥锁之类的同步方法吗?我到底需要在哪里调用互斥锁?

您使用互斥锁使状态更改原子化,不一定要防止两个不同的线程同时访问同一个方法。考虑数据而不是代码。

如果一个方法读取一个成员变量并写回一个修改后的值,那么您希望使其成为原子操作。

您的示例基本上是正确的,但它没有表明访问iStatus成员变量的任何其他方法也应该使用互斥锁(或关键部分)进行保护。

于 2012-10-15T12:28:25.440 回答
0

这取决于你在做什么someMethod,如果它只是为了设置一个 int,然后使用std::atomicboost::atomic为了性能,它是否使用 MFC 访问 GUI 对象或调用非多线程 COM 对象(例如 OCX),然后执行不要从该线程调用它,而是向 DLG 发布/发送消息,并在WindowProc该 DLG 中接收消息并执行您的操作,互斥锁或关键部分适用于您想要更改 C++ 结构(列表、字符串或我的结构)!

于 2012-10-15T12:50:10.377 回答