1 如何创建一个线程
2 如何等待一个线程走完
join()线程间同步
3 如何处理资源共享问题
注意加锁的顺序和释放的顺序,不要造成死锁和活锁。
4 线程有哪些状态,以及如何转换, 优缺点?在什么场景下应用
线程的状态一般有 Ready, block, running, terminate。
当线程没有工作的可做的时候, 比如消息队列为空了, 就让他sleep一会儿。
不建议用suspend,从线程外suspend该线程, 会造成资源无法释放,造成死锁。建议用在线程内部用sleep来控制。
线程间同步:信号量等是用来线程间互斥,join()用来等待其他线程完成。
5 线程的优先级,在什么场景下应用?
线程的优先级是个比较复杂的问题, 分为不同application和应用场景。
在UI程序中, UI线程有最高的优先级,work线程的优先级比较低。
在Server线程中, 监听线程有最高的优先级,work线程优先级最低
还有线程的优先级为动态和静态的。当线程为idle的状态的时候,可以降低其优先级
6 线程间通信问题,
全局变量, message,
7 锁的问题:
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
总结:
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。