ANSWER: Why does not this program quit when compiled in Release mode?

In the previous post, I asked why the following code behaves differently when compilation is made in Release and Debug mode.

class Program
{
    static void Main(string[] args)
    {
        var w = new Worker();
        while (!w.IsDone);
        Console.WriteLine("The work is done.");
    }
}

class Worker
{
    public bool IsDone;

    public Worker()
    {
        var thread = new Thread(Job);
        thread.Start();
    }

    private void Job()
    {
        Thread.Sleep(3000);
        IsDone = true;
    }
}

Let’s check the assembly code generated by the JIT in these two situations.

The following assembly code is what we get when compiling in Debug mode.

{
00007FF9AE2E14A2  push        rsi  
00007FF9AE2E14A3  sub         rsp,40h  
00007FF9AE2E14A7  mov         rbp,rsp  
00007FF9AE2E14AA  mov         rsi,rcx  
00007FF9AE2E14AD  lea         rdi,[rbp+20h]  
00007FF9AE2E14B1  mov         ecx,8  
00007FF9AE2E14B6  xor         eax,eax  
00007FF9AE2E14B8  rep stos    dword ptr [rdi]  
00007FF9AE2E14BA  mov         rcx,rsi  
00007FF9AE2E14BD  mov         qword ptr [rbp+60h],rcx  
00007FF9AE2E14C1  cmp         dword ptr [7FF9AE1C49D8h],0  
00007FF9AE2E14C8  je          00007FF9AE2E14CF  
00007FF9AE2E14CA  call        00007FFA0DF1FDA0  
00007FF9AE2E14CF  nop  
        var w = new Worker();
00007FF9AE2E14D0  mov         rcx,7FF9AE1C55F8h  
00007FF9AE2E14DA  call        00007FFA0DDB00F0  
00007FF9AE2E14DF  mov         qword ptr [rbp+20h],rax  
00007FF9AE2E14E3  mov         rcx,qword ptr [rbp+20h]  
00007FF9AE2E14E7  call        00007FF9AE2E10B0  
00007FF9AE2E14EC  mov         rcx,qword ptr [rbp+20h]  
00007FF9AE2E14F0  mov         qword ptr [rbp+30h],rcx  
00007FF9AE2E14F4  nop  
00007FF9AE2E14F5  jmp         00007FF9AE2E14F8  
        while (!w.IsDone);
00007FF9AE2E14F7  nop  
00007FF9AE2E14F8  mov         rcx,qword ptr [rbp+30h]  
00007FF9AE2E14FC  movzx       ecx,byte ptr [rcx+8]  
00007FF9AE2E1500  test        ecx,ecx  
00007FF9AE2E1502  sete        cl  
00007FF9AE2E1505  movzx       ecx,cl  
00007FF9AE2E1508  mov         dword ptr [rbp+2Ch],ecx  
00007FF9AE2E150B  cmp         dword ptr [rbp+2Ch],0  
00007FF9AE2E150F  jne         00007FF9AE2E14F7  
        Console.WriteLine("The work is done.");
00007FF9AE2E1511  mov         rcx,236EBF53068h  
00007FF9AE2E151B  mov         rcx,qword ptr [rcx]  
00007FF9AE2E151E  call        00007FF9AE2E1368  
00007FF9AE2E1523  nop  
    }
00007FF9AE2E1524  nop  
00007FF9AE2E1525  lea         rsp,[rbp+40h]  
00007FF9AE2E1529  pop         rsi  
00007FF9AE2E152A  pop         rdi  
00007FF9AE2E152B  pop         rbp  
00007FF9AE2E152C  ret  

And the following assembly code is what we get when compiling in Release mode.

        var w = new Worker();
00007FF9AE2E14A2  sub         esp,20h  
00007FF9AE2E14A5  mov         rcx,7FF9AE1C55C8h  
00007FF9AE2E14AF  call        00007FFA0DDB00F0  
00007FF9AE2E14B4  mov         rsi,rax  
00007FF9AE2E14B7  mov         rcx,rsi  
00007FF9AE2E14BA  call        00007FF9AE2E10B0  
00007FF9AE2E14BF  movzx       ecx,byte ptr [rsi+8]  
        while (!w.IsDone);
00007FF9AE2E14C3  test        ecx,ecx  
00007FF9AE2E14C5  je          00007FF9AE2E14C3  
        Console.WriteLine("The work is done.");
00007FF9AE2E14C7  mov         rcx,16EC2D73068h  
00007FF9AE2E14D1  mov         rcx,qword ptr [rcx]  
00007FF9AE2E14D4  call        00007FF9AE2E1368  
00007FF9AE2E14D9  nop  
00007FF9AE2E14DA  add         rsp,20h  
00007FF9AE2E14DE  pop         rsi  
00007FF9AE2E14DF  ret  

As you can see, the JIT does not update the register. That is is perfect for single-threaded applications. But, it does not work with multi-threading.

The solution is to mark the variable as volatile, forcing the runtime to get the updated value all the time.

        var w = new Worker();
00007FF9AE2D14A2  sub         esp,20h  
00007FF9AE2D14A5  mov         rcx,7FF9AE1B55C8h  
00007FF9AE2D14AF  call        00007FFA0DDB00F0  
00007FF9AE2D14B4  mov         rsi,rax  
00007FF9AE2D14B7  mov         rcx,rsi  
00007FF9AE2D14BA  call        00007FF9AE2D10B0  
        while (!w.IsDone);
00007FF9AE2D14BF  cmp         byte ptr [rsi+8],0  
00007FF9AE2D14C3  je          00007FF9AE2D14BF  
        Console.WriteLine("The work is done.");
00007FF9AE2D14C5  mov         rcx,2772C0D3068h  
00007FF9AE2D14CF  mov         rcx,qword ptr [rcx]  
00007FF9AE2D14D2  call        00007FF9AE2D1368  
00007FF9AE2D14D7  nop  
00007FF9AE2D14D8  add         rsp,20h  
00007FF9AE2D14DC  pop         rsi  
00007FF9AE2D14DD  ret  

Compartilhe este insight:

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

There are a lot of scenarios where our applications need to support long-running processes. In this post, I will share...
Nos últimos dois posts demonstrei como as alocações podem implicar em penalidades de performance. Nesse post, parto, novamente, de código...
Recebi um bocado de feedback positivo para minhas palestras no Devxperience deste ano. Muita gente mandou e-mails solicitando, principalmente, os...
Retomar em plenitude todas as atividades econômicas, aumentando o risco de contágio pelo novo coronavírus e, eventualmente, sacrificar uma parcela...
Neste post, compartilho seis benefícios gerados por um bom projeto de Arquitetura de Software.  Cada um desses benefícios ajuda a...
Tem coisas que a gente até sabe, mas ignora pela vaidade… Uma das features mais aclamadas do Microsoft Teams, para...

Curso Reputação e Marketing Pessoal

Masterclasses

01

Introdução do curso

02

Por que sua “reputação” é importante?

03

Como você se apresenta?

04

Como você apresenta suas ideias?

05

Como usar Storytelling?

06

Você tem uma dor? Eu tenho o alívio!

07

Escrita efetiva para não escritores

08

Como aumentar (e manter) sua audiência?

09

Gatilhos! Gatilhos!

10

Triple Threat: Domine Produto, Embalagem e Distribuição

11

Estratégias Vencedoras: Desbloqueie o Poder da Teoria dos Jogos

12

Análise SWOT de sua marca pessoal

13

Soterrado por informações? Aprenda a fazer gestão do conhecimento pessoal, do jeito certo

14

Vendo além do óbvio com a Pentad de Burkle

15

Construindo Reputação através de Métricas: A Arte de Alinhar Expectativas com Lag e Lead Measures

16

A Tríade da Liderança: Navegando entre Líder, Liderado e Contexto no Mundo do Marketing Pessoal

17

Análise PESTEL para Marketing Pessoal

18

Canvas de Proposta de Valor para Marca Pessoal

19

Método OKR para Objetivos Pessoais

20

Análise de Competências de Gallup

21

Feedback 360 Graus para Autoavaliação

22

Modelo de Cinco Forças de Porter

23

Estratégia Blue Ocean para Diferenciação Pessoal

24

Análise de Tendências para Previsão de Mercado

25

Design Thinking para Inovação Pessoal

26

Metodologia Agile para Desenvolvimento Pessoal

27

Análise de Redes Sociais para Ampliar Conexões

Lições complementares

28

Apresentando-se do Jeito Certo

29

O mercado remunera raridade? Como evidenciar a sua?

30

O que pode estar te impedindo de ter sucesso

Recomendações de Leituras

31

Aprendendo a qualificar sua reputação do jeito certo

32

Quem é você?

33

Qual a sua “IDEIA”?

34

StoryTelling

35

Você tem uma dor? Eu tenho o alívio!

36

Escrita efetiva para não escritores

37

Gatilhos!

38

Triple Threat: Domine Produto, Embalagem e Distribuição

39

Estratégias Vencedoras: Desbloqueie o Poder da Teoria do Jogos

40

Análise SWOT de sua marca pessoal

Inscrição realizada com sucesso!

No dia da masterclass você receberá um e-mail com um link para acompanhar a aula ao vivo. Até lá!

A sua subscrição foi enviada com sucesso!

Aguarde, em breve entraremos em contato com você para lhe fornecer mais informações sobre como participar da mentoria.

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano anual do Clube de Estudos:

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano mensal do Clube de Estudos:

× Precisa de ajuda?