多线程编程特性
单个线程随时可能被切换或抢占
事件发生不再具有全局层面的严格时间关系
线程创建销毁守则
程序库不应在未告知的情况下创建“背景线程”(fork仅会复制调用线程,其他线程不会被复制,如其他线程正持有锁,则该锁用不会释放)
尽量用相同方式创建线程(便于对线程统一管理但需注意其他程序库可能同样创建线程)
在进入main()前不要创建线程(确保线程不会访问未被正确初始化的变量)
线程创建最好在初始化阶段全部完成(主要避免线程安全退出涉及的资源释放,thread对象生命周期管理等问题)
特殊场景
1、exit()的线程安全问题
使用exit()退出程序会导致对全局变量的析构,一旦存在其他线程对该变量访问则可能导致故障
2、fork局限性
子进程并不会继承父进程所有属性(如线程、内存锁、文件锁)对这部分属性使用RAII析构可能导致故障发生
如果使用多线程,则除非执行exec(),否则尽量不要使用fork