在
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
分享到:
相关推荐
程序员需要确保在多线程环境下正确使用线程安全的函数,避免出现竞态条件和数据不一致的情况。 10. **线程调度**: Linux系统使用调度算法来决定哪个线程应该获得CPU执行权。线程的调度策略可以通过修改线程属性...
多线程是现代计算机编程中的一个重要概念,它允许一个进程内同时执行多个线程,以提高程序的并发性和效率。在Linux环境下,POSIX线程(也称为pthreads)是实现多线程编程的标准API。 1. **线程定义与创建**: 在...
Posix多线程编程总结 Posix多线程编程是指在一个程序中创建多个执行路线的技术,称为线程。每个线程都可以独立地执行任务,而不影响其他线程的执行。多线程编程可以简化异步事件的处理,提高程序的吞吐量,提高...
Posix有名信号灯是一种跨进程间通信机制,支持多进程和多线程间的同步。使用前需注意权限设置和命名规范,适用于复杂的并发场景。 #### 互斥量 互斥锁(mutex)用于保护临界区,确保同一时间内只有一个线程访问...
综上所述,本FAQ文档覆盖了Linux多线程编程的多个方面,包括pthread API的使用、线程库的选择、线程安全的实现、内存分配、信号处理、调试、errno的使用、TSD的使用以及相关资源的链接等。这些知识点对于开发者设计...
在这个“client-server demo.zip”压缩包中,包含了一个使用C语言实现的多进程和多线程并发服务器的示例。下面将详细探讨相关知识点。 1. **网络编程基础** - **套接字(Sockets)**: 套接字是网络通信的基本接口...
多线程是指在一个进程中同时执行多个线程,这样可以提高应用程序的并行处理能力。在套接字通信中,多线程常用于实现客户端和服务器之间的并发连接处理,或者在同一应用程序中分别处理接收和发送数据。 1. **创建套...
Linux操作系统在GUI编程中广泛应用多线程技术,以克服传统进程模型的局限性。传统的Unix模型依赖于fork()函数创建子进程来执行任务,这种方式存在一些显著的问题。首先,fork()操作开销大,需要复制父进程的内存映像...
- **多线程**:多线程是指在一个进程中同时运行多个执行线程,能提高程序的并发性和执行效率。 - **套接字编程**:在C++中进行网络通信需要使用套接字(socket),它是进程间通信的一种方式,可以实现网络上不同...
1. **多线程技术**:多线程是指在一个进程中可以同时执行多个线程,每个线程代表一个独立的执行流。在Web服务器中,多线程用于并发处理客户端的HTTP请求,提高服务器的响应速度和吞吐量。Linux系统提供了pthread库,...
文件中提到的core文件是当进程异常终止时生成的文件,它包含了进程终止时的内存映像和寄存器状态,对于调试多线程程序是非常重要的。 另外,文件中提到的GDB调试工具,在调试多线程程序时非常有用。GDB提供了丰富的...
引入多线程后,可以在同一进程中同时执行多个任务,每个任务由一个独立的线程完成。 ##### 1.2 线程的优点 - **简化异步事件处理**:通过为不同类型的时间处理分配不同的线程,可以显著简化代码的复杂性,使程序更...
Posix多线程编程是一种在操作系统层面上利用多个并发执行的执行流,即线程,来提高程序性能的技术。在Posix标准下,线程的使用提供了丰富的接口和功能,使得开发者可以构建复杂的多任务应用。 一、多线程的优点 1. ...
而在引入多线程后,一个进程可以在同一时刻执行多个任务。 #### 二、线程的优点 1. **简化异步事件处理**: 通过为每种事件类型的处理分配单独的线程,可以简化处理异步事件的代码。 2. **共享资源**: 多个线程可以...