并行编程中的同步与通信技术
1. 同步操作
在并行编程中,同步操作至关重要。其中,互锁操作比加锁方法执行速度更快。在测试计算机上,互锁操作比加锁方法快约 20%。但要注意,互锁操作并非万能,必须正确使用,且在所有相关位置都要使用。若用互锁指令修改共享数据,却用普通读取方式读取该数据,代码将无法正常工作。例如,将 InterlockedReader 方法中的 value := TInterlocked.Read(FPValue^); 改为 value := FPValue^; ,重新运行测试会得到与原始完全不安全版本相同的错误结果。
2. 对象生命周期
在多线程环境中,对象的创建和销毁需要特别注意,并非所有方法都是安全的,一个小错误就可能导致偶尔崩溃。
- 简单加锁法 :对对象的所有访问进行加锁,在临界区创建、使用和销毁对象,虽然能保证正常工作,但速度慢且易出错,容易忘记加锁。
- 前后创建销毁法 :在后台任务创建前创建对象,在后台任务销毁后销毁对象。对于非 ARC 平台的普通对象,只是共享指针,不会有问题;对于实现接口的对象或在 ARC 平台编译时,引用计数机制会起作用,由于引用计数是线程安全的,也不会有问题。但要确保并行代码中调用的对象所有方法在多线程同时调用时能正常工作。
当并行任务已经在运行时,创建或销毁共享对象会出现问题。销毁对象时,在非 ARC 环境下,一个线程使用对象时另一个线程不能销毁它;在使用接口或 ARC 时,将共享接口赋值为 nil
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



