#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
//extern int errno;
int main(int argc, char **argv)
{
pthread_t thread;
int status;
status = pthread_join(pthread_self(), NULL);
if(status != 0){
fprintf(stderr, "error %d: %s\n", status, strerror(status));
}
if(status == EDEADLK){
printf("error is EDEADLK\n");
}
printf("errno = %d\n", errno);
return status;
}
|
执行结果:
error 35: Resource deadlock avoided
error is EDEADLK
errno = 0
1.传统上的函数在成功返回时,返回一个0指示调用成功或者返回一个有效值,当有错误发生时候,返回-1,并对全局变量errno赋值以指示错误类型;传统的报错机制很难创建在报错的同时返回一个有用的-1值的函数。
2.pthread函数在出错时不会设置errno变量(如上面程序,pthread_join出错,errno仍为0),而大多数其它posix函数会设置。
3.pthread函数用返回值表示错误状态,而不是errno,(比如上面程序,用返回值status表示错误状态EDEADLK), 当成功时返回0,并包含一个额外的输出参数来指向存有“有用结果”的地址;当有错误发生时,返回一个包含在
里的错误代码。
4.pthread同样提供了线程内的errno变量以支持其它使用errno的代码,意味着当线程调用使用errno报错的函数时,errno不会被其它线程重写或者读取;设置和读取线程内的errno变量要比读取内存地址或者返回值带来更多的开销。而传统的UNIX系统和POSIX.1-1990标准中, errno是一个外部整形变量, 由于一次只能有一个值,所以只能支持进程中的单一执行流程(所以,上面例子中, extern int errno 可以去掉)。
5.pthread_join遇到无效的线程id的时候会返回错误代码ESRCH,显示信息:error 3: no such process,如果遇到初始线程(上面例子中,进程没有其它线程),此时,如果Pthread函数实现自死锁检测功能,pthread_join会返回错误代码EDEADLK, 否则线程将挂起等待自己退出(即自死锁)。
6.pthread中没有像perror那样按照指定格式打印错误信息的等价函数,相反使用strerror获得多错误代码的描述,然后打印到strerr文件流中(如上面例子)。
4.
阅读(1277) | 评论(0) | 转发(0) |