getenv()如何是线程安全的?

时间:2015-05-27 08:06:21

标签: c++

我想使用getenv()函数。

现在我收到某人的评论,如果多个线程正在调用此函数,这将不是线程安全的。但是,如果我查看此函数的information page,它会声明:

  

如果环境保持不变,同时调用此函数是安全的。

我理解静态数据块的概念,并且该函数返回指向它的指针。据我所知,通过对函数进行多次调用,块的内容可以随着时间的推移而改变,作为参考页面的状态。

如果一个线程正在调用

getenv("myEnvVar1")

另一个人正在打电话

getenv("myEnvVar2")

在返回的指针指向的地方使用相同的内存块吗?我该如何解释“同时调用此函数是安全的”这一事实?

2 个答案:

答案 0 :(得分:4)

getenv返回一个指向ACTUAL环境内容的指针 - 因此进程有一个包含环境变量的字符串数组,你得到的不是副本,而是指向它的ACTUAL指针。

请注意,char *p = getenv("foo"); ... setenv("foo", "new value"); ... use p也未定义,因为字符串p指向现在可能已经改变[并且没有明确定义]

答案 1 :(得分:2)

不是。

函数getenv是C标准库的一部分,因此它的行为由C标准集指定。

POSIX.1-2017(符合ISO C标准)声明:

  
      
  • 返回的字符串指针可能无效,或者后续调用getenv()可能会覆盖字符串内容,   setenv()unsetenv()或(如果支持)putenv(),但他们不会   受到本卷中任何其他功能调用的影响   POSIX.1-2017。

  •   
  • 如果调用线程被终止,返回的字符串指针也可能无效。

  •   
  • getenv()函数无需是线程安全的。

  •   

ISO C11(POSIX遵循的),说:

  

一组环境名称和改变方法   环境列表是实现定义的。 getenv功能   不需要避免与其他修改执行线程的数据竞争   环境清单。

您无法确定getenv本身在搜索时不会修改环境(我无法想到为什么,但这样做不会违反标准< / em>的)。如果您想确保您使用的getenv版本是一个线程安全的实施,您必须查阅您的实施文档以确认它是。