多线程编程中的关键技术与问题解析
1. 线程中断的思考
在多线程编程里,中断线程并改变其执行任务是一项颇具挑战的需求。当你有此想法时,需审慎重新考量目标。比如,思考为何要中断特定线程,是否能通过以下方式完成工作:
- 从该线程进行轮询;
- 等待线程完成当前任务后查看队列;
- 直接创建新线程执行手头任务。
通常,会有更简便的方法达成目的,应努力探寻。
2. Win32 I/O 完成端口
Win32 的 I/O 完成端口是解决生产者/消费者问题的方案。其操作流程如下:
1. 创建一个带有文件句柄的完成端口;
2. 让多个线程在该完成端口等待;
3. 当数据包抵达文件句柄时,唤醒一个等待线程并交付数据包处理;
4. 线程处理完成后发送回复,再返回端口继续等待。
这种方式深受 Windows NT 开发者喜爱。
3. 线程间通过流通信
有时会探讨线程间通过流、管道、套接字等更高级通信方式进行通信。不过,多数情况下这么做是为了与现有代码对接。若使用他人定义的接口,可采用此方式;否则,不建议这么做。因为线程间通常想交换的是对象,而非字节。流的工作模式是为线程提供字符,若流中无字符,调用者会阻塞;当其他线程写入字符,等待线程会被唤醒处理。这是一种将队列限制为字节的生产者/消费者模型,效率并非最优。所以,虽可通过流通信,但不推荐。
4. Volatile 关键字
在 C 语言中, volatile
关键字用于告知编译器,相关变量的变化独立于本地代码。因此,编译器不