我有一个函数,它将为调用它的不同线程生成一个唯一的随机数(基本上是先前的增量)。
这个线程是安全的还是可重入的。假设我使用静态变量来表示这个数字。
我在这个论坛中看到静态变量不能用于可重入/线程安全。
它是否适用于本地/全局静态。
或者它是实现定义的。
在C语言中,本地static变量以线程安全的方式初始化,因为它们总是在程序启动时、在创建任何线程之前初始化。不允许初始化本地static正是出于这个原因,变量具有非常量值。
static
void some_function(int arg) { // This initialization is thread-safe and reentrant, since it happens at // program startup static int my_static = 42; // ERROR: Initializer is not constant static int another_static = arg; ... }
当然,整个函数是线程安全的还是可重入的,完全取决于你如何use静态变量。由于它们实际上与全局变量相同,因此您需要确保在读取或写入它们(或其他同步结构)时使用正确的互斥体,以确保线程安全。
为了确保函数是可重入的,您需要仔细检查函数何时以及如何调用自身(可能通过另一个函数间接调用),并确保所有全局状态的行为一致。