“世界上只有一个状态机”
但
int Tworker() {
printf("%d\n", x); // Global x
printf("%d\n", x);
}
x
x
unsigned int balance = 100;
int Talipay_withdraw(int amt) {
if (balance >= amt) {
balance -= amt;
return SUCCESS;
} else {
return FAIL;
}
}
两个线程并发支付 ¥100 会发生什么 (代码演示)
在捡起要复制物品的瞬间拿起 1 块钱
分两个线程,计算 $1+1+1+\ldots+1$ (共计 $2n$ 个 $1$)
#define N 100000000
long sum = 0;
void Tsum() { for (int i = 0; i < N; i++) sum++; }
int main() {
create(Tsum);
create(Tsum);
join();
printf("sum = %ld\n", sum);
}
可能的结果
N
还要小), ...“处理器一次执行一条指令” 的基本假设在今天的计算机系统上不再成立 (我们的模型作出了简化的假设)。
单处理器多线程
多处理器多线程
(历史) 1960s,大家争先在共享内存上实现原子性 (互斥)
printf
还能在多线程程序里调用吗?
void thread1() { while (1) { printf("a"); } }
void thread2() { while (1) { printf("b"); } }
我们都知道 printf 是有缓冲区的 (为什么?)
buf[pos++] = ch
(pos
共享) 不就 💥 了吗?RTFM!