c - 多线程应用程序中的堆变量上的volatile

时间:2018-05-30 09:29:29

标签: c volatile

我已在several places中读到应使用volatile关键字:

  

多线程应用程序中的多个任务访问的全局变量

我想确保我做对了 - 如果我有一个堆分配变量,比如说一个持有整数的结构,我应该使用volatile还是应该将它视为非全局变量?

如果只应声明全局变量volatile,为什么会有区别?

简单示例:

struct my_struct
{
    int still_running;
    int keep_running; // should it be declared 'int volatile'?
};

typedef struct my_struct *my_struct_t;

static void *my_thread_func(void *v)
{
    my_struct_t s = (my_struct_t) v;
    do
    {
        printf("thread still running.\n");
    } while (s->keep_running);

    printf("thread stopping.\n");
    s->still_running = 0;

    return NULL;
}

int main(int argc, char **argv)
{
    my_struct_t s = (my_struct_t)malloc(sizeof(struct my_struct));
    s->keep_running = 1;
    s->still_running = 1;

    pthread_t t;
    pthread_create(&t, NULL, my_thread_func, s);

    usleep(1000);
    s->keep_running = 0;

    while(s->still_running);
    free(s);

    return 0;
}

0 个答案:

没有答案