Re: Curious global variable bug? Bad assumptions on my part?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tynan Wilke wrote:
Hello list,

If I am posting in the wrong place, I apologize. I was making some
test scripts this morning and found a pretty glaring difference
between my optimized (-O1) versus my unoptimized (-O0) test code.
Below, is the a quick example that I made showing the problem:
--------------------------------
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

static int g_counter = 0;

void *IncThread(void* nothing)
{
    printf("Thread started\n");
    while( 1 )
    {
        g_counter++;
//        printf("thread g_counter: %d\n", g_counter );
    }
    return NULL;
}

int main()
{
    pthread_t thread;
    if ( 0 != pthread_create(&thread, NULL, IncThread, NULL ) )
    {
        perror("Failed to create thread");
        exit(1);
    }

    printf("Waiting for counter...\n");
    while ( g_counter == 0 );

Make g_counter volatile. And for the real spiffy, you should actually have a lock around it's access. Congrats, you invented a race condition.

Basically what's happening is that g_counter is likely cached in a register, and never read from memory after the initial expression. Making it volatile will fix the bug on most platforms (where read/write of an int is atomic). But the "correct" solution is to place a mutex around it's access.

Tom

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux