保持界面响应性的多线程编程要点
1. 竞态条件
在多线程编程中,若编程时未意识到每个线程都可访问相同内存这一事实,就可能引发诸多问题。当程序因多个线程同时访问共享数据而未给出预期结果时,便存在竞态条件。竞态条件通常发生在某个线程假定自己是某资源的唯一使用者,而该资源实际上被其他线程共享的情况下。
1.1 静态变量引发的竞态条件
以下代码示例展示了一种经典的竞态条件:
static int i;
for (i = 0; i < 25; i++) {
NSLog(@"i = %d", i);
}
在这个例子中,将 i 声明为静态变量并非必要,但它很好地说明了竞态条件。当声明一个变量为静态时,它会成为一个单一的共享变量,无论哪个对象调用此方法都会使用它。若代码在单线程程序中运行,一切正常。因为只要处于循环中,就没有其他代码能改变 i 的值。
然而,一旦引入并发,情况就不同了。若此代码在多个线程中运行,所有线程将共享同一个 i 。当一个线程增加 i 的值时,所有线程的 i 值都会增加。原本每个线程可能期望循环 25 次,但实际上所有线程组合起来总共只会循环 25 次。输出可能如下:
Thread 1:
i=0
i=1
i=4
i=7
i=9
i=12
i=15
i=17
i=20
i=23
Thread
超级会员免费看
订阅专栏 解锁全文
878

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



