C++ 多线程实现中的errno

C++ 多线程实现中的errno,c++,c,errno,C++,C,Errno,要在多线程应用程序中使用errno,此引用指示它应该在每个线程中本地实现。这是什么意思?errno应该是线程本地。在每个线程中此变量的值可以不同 它应该在每个线程中本地实现 将errno实现为thread\u local变量不是您的职责。这是编译器开发人员的工作 从 errno是用于错误指示的预处理器宏。 它扩展为int类型的线程本地可修改左值。(从C++11开始) 简单地说,在C++11编译器中,这段代码永远不应该断言 #include <iostream> #include &

要在多线程应用程序中使用errno,此引用指示它应该在每个线程中本地实现。这是什么意思?

errno
应该是
线程本地
。在每个
线程中
此变量的值可以不同

它应该在每个线程中本地实现

errno
实现为
thread\u local
变量不是您的职责。这是编译器开发人员的工作

errno是用于错误指示的预处理器宏。 它扩展为int类型的线程本地可修改左值。(从C++11开始)

简单地说,在C++11编译器中,这段代码永远不应该断言

#include <iostream>
#include <cerrno>
#include <thread>
#include <cassert>

int g_errno = 0;

void thread_function()
{
   errno = E2BIG;
   g_errno = errno;
}

int main()
{
   errno = EINVAL;
   std::thread thread(thread_function);
   thread.join();
   assert(errno != g_errno && "not multithreaded");
}
#包括
#包括
#包括
#包括
int g_errno=0;
void thread_函数()
{
errno=E2BIG;
g_errno=errno;
}
int main()
{
errno=EINVAL;
std::thread thread(thread_函数);
thread.join();
断言(errno!=g_errno&“非多线程”);
}

这意味着每个线程都应该有自己的
errno
变量实例

通过使用以下方法,实现可以轻松实现这一点:

int __thread errno;
\uuuu thread
是一个gcc扩展,它确保变量是线程本地的(因此一个线程不能覆盖变量的另一个线程实例)


作为errno的用户,您不必担心这一点。您甚至不必担心errno可能已被另一个线程预先更改。

历史上,
errno
int
类型的常见变量,即每个模块都有自己的定义,链接器负责合并它们。所以程序只是简单地声明
int errno全局,并且具有有效的定义

这在多线程环境中会出现故障,因为只有一个变量。因此,
errno.h
现在需要定义左值
int
,程序不应该定义自己的
errno

例如,GNUC库定义了类似于

#define errno (*(__errno_location()))
其中
\uuuu errno\u location()
是一个内联函数,用于计算线程本地
errno
的地址


所有这些都与应用程序无关,只是定义自己的
errno

是一个错误。我的问题是如何做到这一点?通常的程序是包含标题#包含并直接使用errno。如何使它成为本地的?上面的参考说:“支持多线程的库应该在每个线程的基础上实现errno:每个线程都有自己的本地errno”。在实现级别上,它看起来如何?@ WildThing从C++标准:每个线程都要提供单独的ErnO值。“库”的意思是真正的实现。所以我在我的类中包括了errno.h并使用errno,该类实现了多线程而无需任何其他修改?@WildThing。如果你使用的是C++11编译器,这个特性就是在这里实现的。你能详细描述一下这个过程吗?它真的是一个公共变量吗?我以为它是libc中定义的外部变量。@Maxim,是--
extern int errno也可以工作,因为它也可以用于引用公共定义。使用
int errno=0初始化链接失败。