在我的班级中,我使用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);
}
答案 0 :(得分:0)
当我从这个线程调用此方法时,如果此方法同时从主线程调用,则发生了什么。我应该使用一些像mutex这样的同步方法吗?我需要在哪里调用互斥锁?
使用互斥锁使状态更改成为原子,不一定是为了防止两个不同的线程同时访问同一个方法。根据数据而不是代码来考虑它。
如果方法读取成员变量并写回修改后的值,那么您希望将其作为原子操作。
您的示例基本上是正确的,但它并未显示访问iStatus
成员变量的任何其他方法也应使用互斥锁(或关键部分)进行保护。
答案 1 :(得分:0)
这取决于你在someMethod
中做了什么,如果它只是用于设置int,那么使用std::atomic
或boost::atomic
来提高性能,如果使用MFC来访问GUI对象或调用一个非多线程的COM对象(例如OCX),然后不要从该线程调用它,而是发送/发送消息到DLG,并在该DLG的WindowProc
接收消息并执行action,mutexes或critical section适用于你想要更改C ++结构的情况(list,string或my_struct)!