pthread函数的错误检查机制
#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,并包含一个额外的输出参数来指向存有“有用结果”的地址;当有错误发生时,返回一个包含在<errno.h>里的错误代码。
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.