windows多线程编程经验总结

来源:互联网 发布:日落大道 知乎 编辑:程序博客网 时间:2024/06/09 21:38

在windows多线程编程中,需要注意的问题很多。下面是我多线程编程的一部分经验总结。

尽量在用户方式下维持线程的同步,因为用户方式下保持同步,线程可以不必转入内核方式,然后再转换成用户方式,而这时极耗资源的。关于如何保持线程在用户方式下的同步,一个比较好的方法就是使用关键代码段:

1 声明一个CRITICAL_SECTION的全局结构变量CRITICAL_SECTION pcs

2 线程要使用共享的资源时,首先调用InitializeCriticalSection(PRITICAL_SECTION pcs)来初

始化你上面声明的全局结构变量,然后调用EnterCriticalSection(&pcs)来锁定该结构变量,然后就可以使用共享的资源。这时候,如果有其他线程试图通过EnterCriticalSection来锁定共享资源,就会处于等待状态。

3 当线程使用完共享资源后,应该调用LeaveCriticalSection(&pcs)来释放对共享资源的锁定。而这时候,其他试图锁定共享的资源的线程就可以通过调用EnterCriticalSection函数来锁定资源。如果使用完资源后没有调用LeaveCriticalSection来释放资源,那么其他试图锁定资源的线程将不能获取要使用的资源而处于等待状态

4当所有的线程都不再试图访问共享资源时,调用DeleteCriticalSection(&pcs)来释放这个全局结构变量

上面的方式有几个需要注意的地方:

1在调用InitializeCriticalSection0初始化全局结构变量的时候,可能会因为某种原因而失败,所以,建议使用更新的InitializeCriticalSectionAndSpinCount函数来初始化,该函数为调试信息分配了内存,如果内存无法分配,则返回FALSE

2 EnterCriticalSection调用可能会失败,应该注意这方面的跟踪

3尽量使多个资源共享一个CRITICAL_SECTION变量

4如果要同时访问多个资源,则必须始终以相同的顺序来请求对资源的访问,防止死锁的产生

5当有多个处理器时,可以使用循环锁来使等待的线程不进入内核方式,具体方法是使用InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount)来初始化关键代码段要使用的结构变量,其中第二个参数是表示要循环检测的次数,比较合理的循环次数就是4000次

在用户方式下维持线程同步的优缺点分析:

优点:速度快

缺点:关键代码段只能在单个进程中的线程之间使用,容易产生死锁,因为无法设定超时值

原创粉丝点击