我们应该如何处理系统全局变量的竞争条件,比如UNIX中的errno?我看了Tanenbaum的现代操作系统(第4版,117页),上面说使用私有全局变量。所以基本上你为全局变量分配一些内存块,并把它作为参数传递给每个过程。但这如何解决问题呢?

最佳答案

正如jww所链接的,在大多数支持多线程的标准库中,都采取了一些措施来确保系统全局errno在多线程环境中是正常的。在当今时代,一个图书馆如果不把这一点理清,就只能被认为是“无益的”。
在多线程库出现之前的糟糕日子里,对标准库函数的调用(对errno之类的事情有副作用)必须用信号量来保护。是的。
在现代GCC中,有一个扩展线程:
__thread long myThreadPrivateLong;
其他编译器可能也有类似的东西。我偶尔发现这在我自己的代码中很有用。
当然,其他系统全局变量如stdinstdoutstderr不是线程专用的。这毫无意义,因为一个进程只有一个tty(唉*)。在glibc上,我们采取了一些措施来确保对stdout的多线程访问是半正常的,因为像printf()这样的函数在glibc遇到EOL后被实际输出到stdout之前是通过管道缓冲的结果是,同时调用printf()的两个线程的输出行将分离。在过去,对printf()的两次调用所输出的字符只会被混淆成不可读的混乱。您仍然可以通过同时调用fprintf(stderr,...)来实现这一点,因为stderr没有缓冲。
*我说,唉,因为如果有特定于线程的stdout,并且终端应用程序每个线程都有一个终端选项卡,那就太好了。对用户不是很有用,但有时对开发人员非常有用。能够看到单个线程正在做什么是很有用的。

关于linux - 与Errno的比赛条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50888261/

10-16 20:14