下面是我写的程序的主函数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()要同时对一个结构数组作出修改,如何使 这两个线程同步,才能在修改结
构数组的时候不出现冲突?谢谢各位大虾

解决方案 »

  1.   

    用互斥对象。先CreateMutex,访问数据前WaitForSingleObject,访问后ReleaseMutex。
      

  2.   

    使用临界区:
    InitializeCriticalSection
    EnterCriticalSection
    LeaveCriticalSection
    DeleteCriticalSection
      

  3.   

    在对数组进行修改或读取时,先做同步,线程同步有很多方式,可以用关键区,互斥锁,信号量等.CRITICAL_SECTION g_Section;InitializeCriticalSection(&g_Section);
    然后在对数组进行修改前同步
    EnterCriticalSection(&g_Section);
    读取完毕后记得调用
    LeavelCriticalSection(&g_Section);
    当程序运行完毕后,回收资源
    DeleteCriticalSection(&g_Section);
      

  4.   

    在创建线程之前,先执行CreateMutex(NULL, FALSE, NULL)创建互斥对象,并将返回的句柄与线程要访问的公共数据保存在一起,以便线程中使用;
    在各个线程中,当要访问公共数据前,先执行WaitForSingleObject(Mutex句柄, INFINITE)获取互斥对象,这样可以确保不会有多个线程同时访问数据;
    在线程访问完公共数据后执行ReleaseMutex(Mutex句柄)释放互斥对象,使互斥对象可以被再次获取;
    当所有线程结束后,CloseHandle(Mutex句柄)。
      

  5.   

    在你这个程序里,利用临界区(CriticalSection)同步最合适了。
      

  6.   

    临界区是windows的一种内核对象,推荐一本书《Programming Applications for Microsoft Windows》
      

  7.   

    3l,4l正解。程序开始时:
    CRITICAL_SECTION g_Section; 
    InitializeCriticalSection(&g_Section); 
    对你的结构的所有操作都放在
    EnterCriticalSection 
    LeaveCriticalSection
    中就可以了然后在程序结束时
    DeleteCriticalSection先记着怎么用,至于为什么以后慢慢理解。
    推荐一本书《win32多线程程序设计》Jim Beveridge&Robert Wiener著,侯捷译