终止应用程序之前,总是使用join等待后台线程执行完毕:确保终止应用程序之前对所有的后台线程都调用了joinO。这能确保所有的后台线程都有时间进行恰当的清理。如果没有对后台线程调用joinO,后台线程会在主线程终止时突然终止。
最好的同步就是没有同步:如果采用合理的方式设计不同的线程,所有的线程在使用共享数据时只从共享数据读取,而不写入共享数据,或者只写入其他线程不会读取的部分,那么多线程编程就会变得简单得多。这种情况下不需要任何同步每夜不会有竞争条件或死锁的问题。
尝试使用单线程的所有权模式:这意味着,同一时间拥有一个数据块的线程数不多于1.拥有数据意味着没有其他线程允许读/写这个数据。当线程处理完数据时,数据可以传递到一个线程,那个线程目前拥有这个数据的唯一且完整的责任/拥有权。这种情况下,没必要进行同步。
在可能时使用原子类型和操作:通过原子类型和原子操作更容易编写没有竞争条件和死锁的代码,因为它们能够自动处理同步。如果在多线程设计中不可能使用原子类型和操作,而且需要共享数据,那么需要使用一个互斥访问机制来确保同步的正确性。
使用锁保护可变的共享数据:如果需要多个线程可以写入的可变共享数据,而且不能使用原子类型和操作,那么必须使用锁机制,以确保不同线程之间的读和写是同步的。
尽快释放锁:当需要通过锁保护共享数据时,务必尽快释放锁。当一个线程持有一个锁时,也使得其他线程阻塞等待这一个锁,这可能会降低性能。
确保同一顺序获得多个锁:如果多个线程需要获取多个锁,所有线程都要以同样的顺序获得这些锁,以防止死锁。可以通过泛型的std lock或std try lockO以同样的顺序指定要使用的锁,尽可能地减少破坏锁顺序限制的机会。
使用支持多线程的分析器:通过支持多线程的分析器找到多线程应用程序中的性能瓶颈,分析多个线程是否确实利用了系统中所有可用的处理能力。支持多线程的分析器的一个例子是Visual Studio某些版本中的profiler。
了解调试器的多线程支持特性:大部分调试器都有对线程应用程序调试的最基本的支持。应该能得到应用程序中所有正在运行的线程列表,而且应该能改过切换到任意线程,查看线程的调用栈。例如,可以通过这些特性检查死锁,因为可以准确地看到每个线程正在做什么。
使用线程池,而不是动态创建和销毁大量线程:动态地创建和销毁大量的线程会导致性能下降。这种情况下,最好使用一个线程池来重用现有的线程。
使用高级多线程库:尽可能使用高级多线程库,例如Intel Threading Building Blocks(TBB)等,而不是自己实现这个库。多线程编程很难掌握,而且容易出错。另外,自己的实现不一定像预期那样正确工作。
★关于WorkWin公司电脑监控软件★
WorkWin的使命是打造Work用途的Windows 电脑系统,有效规范员工上网行为,让老板知道员工每天在做什么(监控包括屏幕、上网在内的一举一动),限制员工不能做什么(禁止网购、游戏、优盘等)。
WorkWin基于纯软件设计,非常容易使用,无需添加或改动任何硬件,使用一台管理机监控全部员工机电脑。历经南京网亚十余年精心打造,此时此刻每天都有成千上万企业电脑正在运行WorkWin,选择WorkWin选择“赢”。
版权所有,南京网亚计算机有限公司 。本文链接地址: 应用程序线程设计和最佳实践