【多线程】有两个线程都能访问n,初始时n为0,⼀个线程执⾏n++,n+=2,另⼀个线程执⾏n+=3,当两个线程都执行完后n可能的值

必备知识点:n++ 在底层是由三条指令在CPU完成的
  1. load : 将内存的值读取到CPU寄存器
  2. add : 将CPU寄存器中的值进行+1操作
  3. save : 将CPU寄存器中的值写回内容
回答

首先n++操作在底层是由三条指令在CPU完成的,先要将内存中n的值读取到CPU寄存器,然后将CPU寄存器中的值进行+1,最后再将CPU寄存器中的值写回内存。两个线程并发的去执行时有以下几种情况:

  1. 线程1中n++与线程2中n+=3同时执行然后线程1再执行n+=2,有以下几种情况(同时读取到0)
  • 线程1中n++执行时读取到内存中n的值为0,此时线程2中n+=3也读取内存中n的值为0,此时n++在CPU寄存器进行+1后先写回了内存,此时内存中的值为1,这个时候线程2中的n+=3也在寄存器中执行完写回内存,此时内存中的值又被修改为3。在上述描述中线程1执行n+=2时,如果n++后写回内存,那么结果就是3,如果n+=3后写回内存,那么结果就是5.
  1. 线程1中n++执行时先读取到0
  • n++执行完成后,此时n+=2读取到内存的值为1后继续执行,这个时候有种情况,此时n+=2后执行完,结果也就是3,还有一种是线程2中n+=3后执行完也就是4
  1. n++执行完成后,此时线程2中的n+=3读取到内存中的1开始执行,此时也有三种情况,就是n+=3后执行完成,结果也就是4,还有是n+=2后执行完,结果也就是3,还有一种就是n+=3执行完成后,此时内存中n的值为4,然后线程1中的n+=2读取到内存中的值为4,再执行add与save,最后结果是6
  2. 线程2中n+=3先读取到0
  • n+=3执行完毕后内存中n的值为3,此时线程1中n++再读取到3执行后为4,n+=2执行后,结果是6
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用多线程计算n个不同整数之和的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NUM_THREADS 4 // 定义线程数量 #define N 100000000 // 定义整数数量 int *arr; // 整数数组 long long sum = 0; // 整数和 pthread_mutex_t mutex; // 互斥锁 void *sum_func(void *tid) { long thread_id = (long)tid; long long local_sum = 0; long start = thread_id * N / NUM_THREADS; long end = (thread_id + 1) * N / NUM_THREADS; for (long i = start; i < end; i++) { local_sum += arr[i]; } pthread_mutex_lock(&mutex); sum += local_sum; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main() { pthread_t threads[NUM_THREADS]; pthread_mutex_init(&mutex, NULL); // 初始化整数数组 arr = (int *)malloc(N * sizeof(int)); for (long i = 0; i < N; i++) { arr[i] = i; } // 创建线程 for (long t = 0; t < NUM_THREADS; t++) { pthread_create(&threads[t], NULL, sum_func, (void *)t); } // 等待线程结束 for (long t = 0; t < NUM_THREADS; t++) { pthread_join(threads[t], NULL); } printf("The sum of %ld integers is %lld\n", N, sum); pthread_mutex_destroy(&mutex); free(arr); return 0; } ``` 该程序使用了4个线程计算100000000个整数之和。首先,主线程创建一个整数数组,并将其初始化为连续的整数。然后,主线程创建4个线程,并为每个线程分配一段整数数组进行计算。当每个线程计算完成后,它们将计算结果加到一个互斥锁保护的全局变量中。最后,主线程等待所有线程结束,并输出整数和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值