从另一个线程调用对象的成员函数:如何正确使用互斥?

时间:2012-10-15 12:18:15

标签: c++ multithreading mutex

在我的班级中,我使用CreateThread(NULL,0,Execute1,this...)方法创建一个线程。

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

然后我从这个帖子中调用pdlg方法:

pdlg->someMethod();

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  

当我从这个线程调用此方法时,如果此方法同时从主线程调用,则发生了什么。我应该使用一些像mutex这样的同步方法吗?我需要在哪里调用互斥锁?

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

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

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

答案 1 :(得分:0)

这取决于你在someMethod中做了什么,如果它只是用于设置int,那么使用std::atomicboost::atomic来提高性能,如果使用MFC来访问GUI对象或调用一个非多线程的COM对象(例如OCX),然后不要从该线程调用它,而是发送/发送消息到DLG,并在该DLG的WindowProc接收消息并执行action,mutexes或critical section适用于你想要更改C ++结构的情况(list,string或my_struct)!