是一个始终为多线程定义/合法的函数指针变量(线程安全)- C

问题描述 投票:0回答:1

变量(即指向函数本身的指针)是线程安全的吗? 对于线程安全,我的意思是该值总是定义的吗? 就像它始终是一个合法值,一个现有函数的 adr。 (我在某个时刻分配给这个值的一些函数)

我认为将值存储在变量中应该始终是单个汇编指令(类似于“读取”)。考虑到应该没问题,不是吗?

注意:我的意思是在单核 CPU 上。 (我不确定这是否有影响)

代码示例,set_a() 和 do_something() 可以随时从任何线程调用。

测试.h

typedef int fn_t (int a);

void set_a(fn_t * fn);

void do_something(void);

测试.c

static fn_t * a;

void set_a(fn_t * fn){
    a = fn;
}

void do_something(void){

    if (a != NULL && a(1) == 0){
        printf(" Happend \n");
    }

    printf("Doing something else \n");
}

谢谢你

c multithreading thread-safety function-pointers
1个回答
0
投票

变量(即指向函数本身的指针)是线程安全的吗?

需要明确的是,变量是“线程安全的”,因为没有线程会看到它包含除初始值或程序分配给它的值之外的值。但是,您的代码不是线程安全的方式使用变量。

这个表达式,

a != NULL && a(1) == 0
首先测试值,然后使用指针。没有什么可以阻止其他线程在测试和使用之间更改值。

线程安全的变量和对象不会神奇地为使用它们的代码赋予线程安全性。

© www.soinside.com 2019 - 2024. All rights reserved.