多线程实现中的errno
errno in Multithread implementation
要在多线程应用程序中使用errno,请参阅http://www.cplusplus.com/reference/cerrno/errno/指示它应该在每个线程中本地实现。这是什么意思?
errno
应为thread-local
。在每个thread
中,该变量的值可以不同。
它应该在每个线程中本地实现
将errno
实现为thread_local
变量不是您的职责。这是编译器开发人员的工作。
来自cppreference.com
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");
}
历史上,errno
是int
类型的常见变量,即每个模块都有自己的定义,链接器负责合并它们。因此,程序只是在全局范围内声明int errno;
,并有一个有效的定义。
这在多线程环境中会崩溃,因为只有一个变量。因此,errno.h
现在需要定义左值int
,程序不应该定义自己的errno
。
例如,GNU C库定义了类似于的东西
#define errno (*(__errno_location()))
其中CCD_ 12是计算线程本地CCD_。
所有这些都与应用程序无关,只是定义自己的errno
是一个错误。
这意味着每个线程都应该有自己的errno
变量实例
该实现可以通过使用以下内容轻松实现:
int __thread errno;
__thread
是一个gcc扩展,它确保变量是线程本地的(因此一个线程不能覆盖变量的另一个线程实例)
作为errno的用户,您不需要担心这一点。您甚至不需要担心errno可能已被另一个线程预先更改。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 多线程实现中的errno