1) 避免使用全局变量,全局变量,指针传递必须特别小心,尤其是在内核;
2)采用信号量,读写信号量,自旋锁,读写自旋锁对共享的数据进行保护,信号量当最大值为1时就相当于互斥量了;
3)如果要获取多个锁,必须以顺序的方式获得,比如有2个锁,lock1和lock2,一个进程必须获取这两个锁才能运行时,必须先获取lock1,在获取lock2,避免一个进程获取了lock1,而另一个进程获取了lock2,造成死锁;
4)使用自旋锁时,因为锁被其它地方获取,则会一直等待,并且重复检查锁,因此在使用自旋锁时,自旋锁必须在尽可能短的时间内拥有;另外,任何拥有自旋锁的代码应为原子的,它不能休眠;事实上,不能因为任何原因放弃处理器,但是现实中并不是这样,所以必须小心使用;for example,许多内核函数都可以休眠,如用户空间到内核空间copy数据,还有当我们获得锁的时候,此时产生了一个中断,而中断处理例程在返回前也要获得这个锁,这样就死锁了。
5)有时可以用循环缓冲区代替锁,就像生产者消费者线程一样,设置一个循环缓冲区和两个移动的指针,就可以控制同步,这种方法在进程之间的通信也可以使用;
6)线程之间的通信可以使用mutex,semaphore,Event控制,其中semaphore,event可以和waitforsingleobject等函数一起使用,来控制2个线程通信;mutex主要用在多个线程同时访问共享数据时,进行保护;
7)windows多线程必须避免在线程中调用 MFC控件等用户界面线程的东东,避免在程序退出时,由于用户界面线程已经退出,而工作者线程不能退出的情况,从而造成程序死掉。如果一定要使用这个东东,记得和 MsgWaitForMultipleObjects函数一起使用。