《操作系统导论》之并发问题

#include <stdio.h> 
#include <stdlib.h> 
#include "common.h" 

volatile int counter = 0; 
int loops; 

void *worker(void *arg) 
{ 
    int i; 
    for (i = 0; i < loops; i++)
    { 
        counter++; 
    } 
    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
     if (argc != 2)
     { 
         fprintf(stderr, "usage: threads <value>\n"); 
         exit(1); 
     } 
     loops = atoi(argv[1]); 
     pthread_t p1, p2; 
     printf("Initial value : %d\n", counter); 
 
     Pthread_create(&p1, NULL, worker, NULL); 
     Pthread_create(&p2, NULL, worker, NULL); 
     Pthread_join(p1, NULL); 
     Pthread_join(p2, NULL); 
     printf("Final value : %d\n", counter); 
     return 0; 
}
主程序利用 Pthread_create() 创建了两个线程( thread)。你可以将线程看作与其他函数在同一内存空间中运行的函数,甚且每一都有多个线程处于活动 状态。在这个例子中,每个线程开始在一个操为 worker()的函数中运行,在该函数中,它只 是递增一个计数器,循环 loops 一。
下面是运行这个程序、将变量 loops 的输入值设置为 1000 时的输出结果。 loops 的值决 定了两个 worker 各自在循环中增加共享计数器的一数。如果 loops 的值设置为 1000 甚运行 程序,你认为计数器的最终值是多少?
prompt> ./thread 100000 
Initial value : 0 
Final value : 143012 // huh?? 
prompt> ./thread 100000 
Initial value : 0 
Final value : 137298 // what the??

程序中的关键部分是增加共享计数器的地方,它需要 3 条指令:一条将计 数器的值从内存加载到寄存器,一条将其递增,另一条将其保存回内存。因为这 3 条指令 并不是以原子方式atomically)执行(所有的指令一次性执行)的,所以奇怪的事情可能会发生。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值