下面是我写的程序的主函数main()
{
DWORD ThreadID1=1;
HANDLE hRead1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID1);
DWORD ThreadID2=2;
HANDLE hRead2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)output,NULL,0,&ThreadID2);
while(1)
{
control();
}
}
其中getInput()与control()要同时对一个结构数组作出修改,如何使 这两个线程同步,才能在修改结
构数组的时候不出现冲突?谢谢各位大虾
{
DWORD ThreadID1=1;
HANDLE hRead1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID1);
DWORD ThreadID2=2;
HANDLE hRead2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)output,NULL,0,&ThreadID2);
while(1)
{
control();
}
}
其中getInput()与control()要同时对一个结构数组作出修改,如何使 这两个线程同步,才能在修改结
构数组的时候不出现冲突?谢谢各位大虾
InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection
DeleteCriticalSection
然后在对数组进行修改前同步
EnterCriticalSection(&g_Section);
读取完毕后记得调用
LeavelCriticalSection(&g_Section);
当程序运行完毕后,回收资源
DeleteCriticalSection(&g_Section);
在各个线程中,当要访问公共数据前,先执行WaitForSingleObject(Mutex句柄, INFINITE)获取互斥对象,这样可以确保不会有多个线程同时访问数据;
在线程访问完公共数据后执行ReleaseMutex(Mutex句柄)释放互斥对象,使互斥对象可以被再次获取;
当所有线程结束后,CloseHandle(Mutex句柄)。
CRITICAL_SECTION g_Section;
InitializeCriticalSection(&g_Section);
对你的结构的所有操作都放在
EnterCriticalSection
LeaveCriticalSection
中就可以了然后在程序结束时
DeleteCriticalSection先记着怎么用,至于为什么以后慢慢理解。
推荐一本书《win32多线程程序设计》Jim Beveridge&Robert Wiener著,侯捷译