单核cpu下,有一个变量int a=0;两个线程同时进行a++操作100次,不加锁,最后a的值是?

各位大佬,请教一下这个问题,多核cpu下的线程切换极端情况可以实现最小值为2,这个我大概理解了,但是多核这种调度情况为什么单核不能做到,单核在调度的时候存不存在什么限制。这个问题在网上很常见,但是都没有怎么解释为什么单核为什么最小值是100.
按照汇编指令:
mov eax,dword ptr[a]
add eax,1
mov dword ptr[a],eax
麻烦帮忙解释下最小值为100时,是怎么样调度的

0
扫码支付0.1元 ×
其他相关推荐
两个线程同时对int a=0进行a++一百次最后的结果可能为多少?
关于这个问题csdn的博客上有很多博客都是说为200 首先贴上代码 public class Test { private static int i = 0; public static void main(String[] args) { Runnable runnable = () -> { for (int j = 0; ...
两个线程同时做100次a++
全局变量int a=0;现用两个线程执行100次a++,求a的最终值 #include "stdafx.h" #include #include //子线程函数 int a=0; unsigned int __stdcall ThreadFun(PVOID pM) { int i=0; printf("线程ID号为%4d的子线程说:Hello World\n",
i的初始值为0,i++在两个线程里面分别执行100次?
来自牛客网。题目描述:i的初始值为0,i++在两个线程里面分别执行100次,能得到最大值是 ? ,最小值是 ?假设两个线程a,b首先a执行99次,i为99,在未被写入内存时,b取i=0时执行1次,写入内存后i=1,此时覆盖掉了i=99的值; 然后a取i=1执行1次,b取i=1执行99次,当a比b后写入内存时,a覆盖掉b,此时i=2。
进程有一个全局变量i,还有有两个线程。i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?
i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令: 1、从内存中把i的值取出来放到CPU的寄存器中 2、CPU寄存器的值+1 3、把CPU寄存器的值写回内存 多核CPU最小值为2,最大值200 i++是由3条指令构成的运算操作,两个线程在i变量上共计需要执行100(次循环)*3(条指令)*2(个线程)=600条指令,这600条指令在某种排
两个线程分别执行100次i++
原文:http://blog.csdn.net/will130/article/details/48714343 i++只需要执行一条指令,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。 如此
i++在两个线程执行100次,最终的结果是
i++语句只需要执行一条指令 但当有多个线程时,并不能保证多个线程i++,操作同一个i。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。 如此,假设两个线程的执行步骤如下: i++在两个线程中执行100次的时候,由于,对于多线程,线程共用一个内存,如果线程A在寄存器中执行了加一操作而没有写入内存,那么将会切入到
操作系统---基础题目汇总十
1、并发是并行的不同表述,其原理相同。 正确答案: A A、错 B、对 并发是同时执行不过微观上是串行的,并行是同时执行,但是是不同的处理器执行,网上有个例子是说并发是一个馒头喂两个人,并行是两个馒头喂两个人。 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对
两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
两个线程并发执行以下代码,假设a是全局变量,那么以下输出_哪个是可能的?int a=1; void foo(){ ++a; printf("%d",a); }解析假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1 A:3, 2 y先执行++a,a为2; y再执行printf,a入栈,在打印到终端之前切换到x x执行++a,a为3; x执行printf,输出3;再切换到
Java线程:线程的同步与锁 一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对
Java线程:线程的同步与锁       一、同步问题提出   线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。   public class Foo {      private int x = 100;   
面试---i++在两个线程分别执行100次,最大值和最小值分别多少
i++只需要执行一条指令,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。如此,假设两个线程的执行步骤如下:1、 线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存
金山面试题--四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1
/** * * 四个线程,a b c d ,共享一个变量 i ab 为加线程, cd 为减线程,四个线程执行顺序为 abcd,且输出为 0 1 2 1 0 1 2 1 0 * 1..... 共享一个变量,我们可以加一个锁就够了,关键是什么执行,什么时候等待 * 其中一个线程执行后,会唤醒所有线程,进行CPU竞争,当然也包括它自己,一共四个线程,我们可以分配两个开关 ,flag1,flag
两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
两个线程对一个变量进行++操作,直至变量值为20
两个线程对一个变量进行++操作,直至bian #include #include #include #include #include pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; int tmp=0; void printids(const char *s) { pid_t pid; pthread_t ti
关于线程并发访问全局变量问题
1.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的? void foo(){ ++a; printf("%d ",a); } A、3 2 B、2 3 C、3 3 D、2 2 我想知道D为什么可能出现,个人觉得 AD都不可能呀不好意思漏了条件了 a初始为1 我怎么觉得都可能呢? 假设线程x和y同时执行,x和y可随
i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?(答案是200和2)
 i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令: 1、从内存中把i的值取出来放到CPU的寄存器中 2、CPU寄存器的值+1 3、把CPU寄存器的值写回内存 如果是单线程操作,i++毫无问题;但是在多核处理器上,用多线程来做i++会有什么问题呢? 我再仔细地重复一遍问题:进程有一个全局变量i,还有有两个线程。每个线程的功能,就是循环100次,执行i++。问线程代码全
请实现这两个变量数值的交换(比如int a = 10,int b = 20变成int a = 20,int b = 10),要求写3种或3种以上的实现方式
第一种: a = a + b; b = a - b; a = a - b; 第二种: a = a ^ b; b = a ^ b; a = a ^ b; 第三种: b = (a + b) - (a = b);
单核cpu下,有一个变量int a=0;两个线程同时进行a++操作100次,不加锁,最后a的值是?
各位大佬,请教一下这个问题,多核cpu下的线程切换极端情况可以实现最小值为2,这个我大概理解了,但是多核这种调度情况为什么单核不能做到,单核在调度的时候存不存在什么限制。这个问题在网上很常见,但是都没有怎么解释为什么单核为什么最小值是100.rn按照汇编指令:rnmov eax,dword ptr[a]rnadd eax,1rnmov dword ptr[a],eaxrn麻烦帮忙解释下最小值为100时,是怎么样调度的rn
两个线程,循环输出1~100
public class Test {       //state==1表示线程1开始打印,state==2表示线程2开始打印       private static int state = 1;              private static int num1 = 1;       private static int num2 = 2;              pub
多线程实现一个累加(可以是具体业务)操作
在日常的应用中经常会遇到结果准确性与性能的权衡问题,比如:现在循环100次统计一个数值,每次计算累加操作耗时100毫秒;怎样才能做到在最短的时间内返回正确的结果? 普通做法 在这个直接累加100 public static void main(String[] args) throws Exception { long start = System.currentTimeMi...
定义两个变量a和b,不使用第三个变量,使两个值交换
public class Demo04 { public static void main(String[] args) { test(3,4); } public static void test(int a,int b){ System.out.println("交换前 a="+a); System.out.println("交换前 b="+b); a = a+b; b =
有两个int型变量a,b,在不使用第三个变量的情况下实现a,b互换
a=a+b; b=a-b; a=a-b;
最近做的一道随机问题,好像是int a[]={1,2,3,4,5,6,7,8,9}; 输出一个随机数组a[]={5,8,7,9,1,4,6,2,3};
开始感觉也好难,现在认真想一下,其实也比较简单,这里我用一个list来帮我解决随机数产生重复的问题。 看代码: import java.util.ArrayList; import java.util.List; import java.util.Random; public class RandomTest { /** * @param args */
多线程访问变量是否要加锁
是否要加锁? 加锁的代价有多大? 现在有个变量 static int g_delRecordFlag = 0;多个线程同时访问,加了互斥锁,感觉资源消耗的有点多。 这个变量即使多个线程访问冲突,也没有什么大的问题,很纠结是否加锁。 询问同事,arm访问int是原子型的,可以不加锁。 网上查询了下, 1.int变量读写是否是原子操作,是平台相关的,可以看内核相应平台的atomic.h中对
Java多个线程同时访问操作单例对象,需不需要加锁的问题
1、多个线程处理单例对象的共有属性         如果两个线程同时访问同一个方法的时候,如果这个方法操作了单例对象中共有的属性,则需要加锁。 2、多个线程不是处理单例对象的共有属性(可能调用的是某个方法,该方法没有操作对象中的全局属性)         多个线程如果不是同时处理一个对象的共有属性,则不会出现线程问题,即使是方法中的属性。         如果两个线程同时访问同一个方法的时...
一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围。
点击打开原文链接代码:int tally = 0;//glable void ThreadProc() { for(int i = 1; i <= 50; i++) tally += 1; }答案:[50,100]解析:tally += 1 分为三条指令:(1)tally内存进入寄存器;(2)寄存器加1;(3)寄存器数据放回内存tally;...
变量交换 如果要把两个整型变量a、b的值交换,一般要采用一个中间变量做过渡, 但也可以在不借助任何其它变量的情况下完成。
/* 变量交换 如果要把两个整型变量a、b的值交换,一般要采用一个中间变量做过渡, 但也可以在不借助任何其它变量的情况下完成。试填写缺失的代码。 */ public class 变量交换 { public static void main(String[] args) { int a = 5; int b = 7; a = a^b; b = a^b; a = a^b;
在多线程中,A类有一个静态成员变量,如果A类在运行期间修改了它,B类是否能知道
     可以通过static关键字修饰成员变量,static表示的意思是该成员变量为类所拥有,并不是某一具体对象所拥有,通过该类实例化的所有对象共享static修饰的成员变量,static修饰的成员变量在内存中占有一块固定的内存,所以,你可以在A中修改staitc修饰的成员变量,在B中可以看到修改的结果。如果成员变量不定义为static,那么每当你new一次,相当于给该成员变量分配一次内存,所以...
java 多线程操作同一个变量
例子,假设是个卖票系统,多个线程(例子中有2个线程)操作同一个变量ticketCount(余票的数量)。 Expected : 多个线程对同个变量会同步操作,不会造成混乱。   public class Test implements Runnable {  private String threadName;  private int ticketCount;  public Tes
多线程操作同一个变量
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized  同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized
单核、多核上锁、同步操作、原子操作
(1)      所有的同步操作最基础的理论就是原子操作,内存屏障、锁都是为了保证在不同平台或者cpu下的原子操作。 内存屏障作用: A:在编译时,拒绝编译器优化之后的指令 B:在运行时,告诉内存地址总线,共享数据地址必须同步   锁是内存中一种整型数据,只有两种状态:空闲和上锁。 加锁过程 1、  read lock 2、  判断lock状态 3、  如果已经加锁,返回失败
操作系统虚拟存储器的一道经典练习题 int a[100][100]
有一个矩阵 int a[100][100],以行为先进行存储。假设有一个虚拟存储系统,物理内存有3页,其中1页用来存放程序,其余2页用于存放数据。 程序A for (i=0;i for(j=0;j a[i][j]=0; 程序B for(j=0;j for (i=0;i a[i][j]=0; 若每页可存放200个整数,程序A和程序B的执行过程各会发生多少次缺页?
用java写一个多线程程序,其中两个对一个变量加1,另两个对一个变量减1
public class IncDecThread {     private int j=10;          /*      * 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1      * 两个问题:      * 1、线程同步--synchronized      * 2、线程之间如何共享同
a=1,b=2,不用第三个变量,a,b互换?
http://topic.csdn.net/u/20090602/10/9230a0fc-65c6-4bc8-974f-91d28f7e00c8.html
多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
以下多线程对int型变量x的操作,哪几个需要进行同步:( ) A. x=y; B. x++; C. ++x; D. x=1; 从表面看上去实在是看不出什么突破口,我们不妨将这些代码译成汇编语言再来分析。   01  x = y;  02  mov eax,dword ptr [y]  03  mov dword ptr [x],e
两个线程A和B, A打印1, 3, ..., 99, B打印2, 4, ..., 100, 要求A和B严格交替打印(Java实现)
第一种实现: public class ThreadAB1 { Thread A = new Thread(new Runnable() { public void run() { for (int i = 1; i < 100; i += 2) { print("A " + i); } } }); Thread B = new Thread(new Runna
多线程自增问题
i++ 考虑变量i++的操作,实际上可以分解为以下3步: (1)从内存单元读入寄存器; (2)在寄存器中对变量做增量操作; (3)把新的值写回内存单元。 如果两个线程试图几乎在同一时间对同一变量做增量操作而不进行同步的话,结果可能就不一致了,在上述代码中,我们传进线程函数的是变量的地址,那么变量i自增后,可能还没有写回内存单元,就被另一个线程读取了,那为什么不是只创建了一个线程了,而是确
四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1 2...
java多线程上机题目
多线程访问同一变量是否需要加锁
对于多线程访问同一变量是否需要加锁的问题,先前大家都讨论过。今天用代码验证了一下之前的猜想:32位CPU与内存的最小交换数据为4字节/次,这也是结构体要对齐4字节的原因。在物理上,CPU对于同一4字节的内存单元,不可能写2个字节的同时,又读了3字节。 测试环境为: XEON 2CPU*2 Windows7 采用50,50,50线程交叉读写,试验代码如下: C/C+
Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
扫盲: 想想自己多线程解决生产消费者问题就知道个synchronized,真是惭愧 为做此题目特意学习新的多线程知识–ReentrantLock跟synchronized一样都是Java中的可重入锁(可以在内部锁中拿到外部锁) Condition是条件的意思,Condition.await()让线程进入等待,Condition.signal()唤醒线程 package cn.itc
关于脏数据比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时
关于脏数据比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时 提问者: lwk2008     发布时间:2014-08-02     浏览:113     回复:0     悬赏:0.0希赛币 关于脏数据 比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时候,
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 python教程线程变量 大数据和机器学习是一个吗

相似问题

1
c++,CreateThread在类中使用,要如何声明线程函数呢
1
c++ 11 在局部使用async()创建一个线程,当程序运行出局部区域时,为什么代码会阻塞等待线程执行结束?
6
java线程类Thread和Runnable的疑问有大神知道吗?
4
写了一个测试类 打算创建一些线程 同时加一个数,然后发觉同步不了,不知道为什么
2
是开两次多线程分别处理两个服务消耗大,还是开一次多线程一次性处理两个服务消耗大啊?
0
将session绑定线程后,为什么手动关闭session不会报已关闭Session错误。
1
如何利用线程机制设计自己创意一个多道程序?
2
关于生产消费线程,消费者重复执行的问题
1
c语言中如何理解参数是从线程
1
WEB应用中业务Id锁有什么好的实现方案吗?
4
asp.net 后台开线程写脚本提示异常“ 响应在此上下文中不可用”
0
C语言加壳为什么修改CONTEXT之后恢复线程时程序还是会崩溃?求大佬指点
1
loadrunner中的三个组件算是线程吗
6
下面的代码怎么修改,才能保证线程里不报空指针异常
10
线程之间的切换会消耗系统性能为啥还用多线程?
1
delphi 怎样在线程里添加NMUDP控件的onDataRecieved事件?
1
ThreadPoolExecutor添加线程不执行,为什么
2
c#中自定义控件控制线程时,两个控件间相互影响,怎么避免?
1
python pyqt5 怎样暂停和退出指定线程?
2
这段代码有没有问题 我现在的heart_rate值不正常了 一些无用代码省略了