`

如何让errno多线程/进程安全

阅读更多

linux 或者 unix 环境中, errno 是一个十分重要的部分。在调用的函 数出现问题的时候,我们可以通过 errno 的值来确定出错的原因,这就会 涉及到一个问题,那就是如何保证 errno 在多线程或者进程中安全?我们希望在多线程或者进程中,每个线程或者进程都拥有自己独立和唯一的一个 errno ,这样就能够保证不会有竞争条 件的出现。一般而言,编译器会自动保证 errno 的安全性,但是为了妥善期间,我们希望在写 makefile 的时 候把 _LIBC_REENTRANT 宏定义,比 如我们在检查 <bits/errno.h> 文件中发现如下的定义:

 

# ifndef __ASSEMBLER__
/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())
#  endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */

 

也就是说,在没有定义 __LIBC 或者定义 _LIBC_REENTRANT 的时候, errno 是多线程 / 进程安全的。
一般而言, __ASSEMBLER__, _LIBC _LIBC_REENTRANT 都不会被编译器定义,但是如果我们定义 _LIBC_REENTRANT 一次又何妨那?
为了检测一下你编译器是否定义上述变量,不妨使用下面一个简单程序。

 

#include <stdio.h>
#include <errno.h>

int main( void )
{
#ifndef __ASSEMBLER__
        printf( "Undefine __ASSEMBLER__\n" );
#else
        printf( "define __ASSEMBLER__\n" );
#endif

#ifndef __LIBC
        printf( "Undefine __LIBC\n" );
#else
        printf( "define __LIBC\n" );
#endif

#ifndef _LIBC_REENTRANT
        printf( "Undefine _LIBC_REENTRANT\n" );
#else
        printf( "define _LIBC_REENTRANT\n" );
#endif

        return 0;
}

 

希望读者在进行移植的时候,读一下相关的 unix 版本的 <bits/errno.h> 文 件,来确定应该定义什么宏。不同的 unix 版本可能存在着一些小的差别!

 

Quote : http://blog.csdn.net/hello_wyq/archive/2006/08/01/1006216.aspx

分享到:
评论

相关推荐

    linux多线程编程[收集].pdf

    程序员需要确保在多线程环境下正确使用线程安全的函数,避免出现竞态条件和数据不一致的情况。 10. **线程调度**: Linux系统使用调度算法来决定哪个线程应该获得CPU执行权。线程的调度策略可以通过修改线程属性...

    POSIX多线程程序设计.pdf

    多线程是现代计算机编程中的一个重要概念,它允许一个进程内同时执行多个线程,以提高程序的并发性和效率。在Linux环境下,POSIX线程(也称为pthreads)是实现多线程编程的标准API。 1. **线程定义与创建**: 在...

    Posix多线程编程[总结].pdf

    Posix多线程编程总结 Posix多线程编程是指在一个程序中创建多个执行路线的技术,称为线程。每个线程都可以独立地执行任务,而不影响其他线程的执行。多线程编程可以简化异步事件的处理,提高程序的吞吐量,提高...

    linux多线程编程

    Posix有名信号灯是一种跨进程间通信机制,支持多进程和多线程间的同步。使用前需注意权限设置和命名规范,适用于复杂的并发场景。 #### 互斥量 互斥锁(mutex)用于保护临界区,确保同一时间内只有一个线程访问...

    设计Linux多线程编程FAQ.pdf

    综上所述,本FAQ文档覆盖了Linux多线程编程的多个方面,包括pthread API的使用、线程库的选择、线程安全的实现、内存分配、信号处理、调试、errno的使用、TSD的使用以及相关资源的链接等。这些知识点对于开发者设计...

    在Linux下的网络编程demo,C语言实现了多进程和多线程的并发服务器案例,client-server demo.zip

    在这个“client-server demo.zip”压缩包中,包含了一个使用C语言实现的多进程和多线程并发服务器的示例。下面将详细探讨相关知识点。 1. **网络编程基础** - **套接字(Sockets)**: 套接字是网络通信的基本接口...

    多线程套接字间通信

    多线程是指在一个进程中同时执行多个线程,这样可以提高应用程序的并行处理能力。在套接字通信中,多线程常用于实现客户端和服务器之间的并发连接处理,或者在同一应用程序中分别处理接收和发送数据。 1. **创建套...

    Linux多线程在GUI编程中的应用.pdf

    Linux操作系统在GUI编程中广泛应用多线程技术,以克服传统进程模型的局限性。传统的Unix模型依赖于fork()函数创建子进程来执行任务,这种方式存在一些显著的问题。首先,fork()操作开销大,需要复制父进程的内存映像...

    C++多线程端口扫描程序

    - **多线程**:多线程是指在一个进程中同时运行多个执行线程,能提高程序的并发性和执行效率。 - **套接字编程**:在C++中进行网络通信需要使用套接字(socket),它是进程间通信的一种方式,可以实现网络上不同...

    linux下c语言实现多线程web服务器

    1. **多线程技术**:多线程是指在一个进程中可以同时执行多个线程,每个线程代表一个独立的执行流。在Web服务器中,多线程用于并发处理客户端的HTTP请求,提高服务器的响应速度和吞吐量。Linux系统提供了pthread库,...

    设计_Linux多线程编程FAQ[参考].pdf

    文件中提到的core文件是当进程异常终止时生成的文件,它包含了进程终止时的内存映像和寄存器状态,对于调试多线程程序是非常重要的。 另外,文件中提到的GDB调试工具,在调试多线程程序时非常有用。GDB提供了丰富的...

    Posix多线程编程

    引入多线程后,可以在同一进程中同时执行多个任务,每个任务由一个独立的线程完成。 ##### 1.2 线程的优点 - **简化异步事件处理**:通过为不同类型的时间处理分配不同的线程,可以显著简化代码的复杂性,使程序更...

    Posix多线程编程学习笔记

    Posix多线程编程是一种在操作系统层面上利用多个并发执行的执行流,即线程,来提高程序性能的技术。在Posix标准下,线程的使用提供了丰富的接口和功能,使得开发者可以构建复杂的多任务应用。 一、多线程的优点 1. ...

    Linux下的多线程编程

    而在引入多线程后,一个进程可以在同一时刻执行多个任务。 #### 二、线程的优点 1. **简化异步事件处理**: 通过为每种事件类型的处理分配单独的线程,可以简化处理异步事件的代码。 2. **共享资源**: 多个线程可以...

Global site tag (gtag.js) - Google Analytics