UNIX环境高级编程 第11章 线程
2017-05-16 23:54
399 查看
使用C++调用pthread_cleanup_push( )时,下面的代码是无法编译通过的:
如果编译,则编译器可能会提示:no matching constructor for initialization of '__pthread_cleanup_class'。
由于相对于C语言而言,C++对类型的要求更严格,不同的不兼容类型之间不能直接转换,比如在C++中,int *(int指针)类型和unsigned long类型就不允许直接转换,必须使用reinterpret_cast来进行类型转换,而C语言则可以使用(unsigned long)这种形式进行转换。此外,C++和const对象和非const对象也不能随意转换,从非const对象可以加上const属性转换到const对象,反之则不可以,上述代码中的"thread 1 first handler"的类型是const char *,而pthread_cleanup_push函数函数原型为:
其第二个参数类型为void *,无法从实参const char *类型转换到形参char *类型,因此该就没有匹配的构造函数来调用。
解决方法是将第二个参数使用字符数组来存储,然后将数组传递给形参,数组名会自动转换到指针,如下:
至于为什么这个C语言版本的UNIX库函数调用会涉及到C++的类及构造函数,是因为该头文件检测到使用C++编译器时,就额外封装pthread_cleanup_class类,具体细节可自行查看/usr/include/pthread.h头文件。
pthread_cleanup_push/pop函数和C++的异常处理机制之间有着未知的相互影响或者潜在的冲突,因此不要在C++中调用pthread_cleanup_push/pop函数。例如书本图11-5中的代码,使用C编译器和C++编译器编译出来的二进制程序执行结果就不相同,如下图:
在C中,线程1没有执行清理函数,而C++中则执行了清理函数。pthread_cancel( )、pthread_cleanup_push/pop函数和C++的异常处理机制共用可能引发内存泄漏,资源丢失,程序崩溃,死锁等现象。
pthread_cleanup_push(cleanup, "thread 1 first handler");
如果编译,则编译器可能会提示:no matching constructor for initialization of '__pthread_cleanup_class'。
由于相对于C语言而言,C++对类型的要求更严格,不同的不兼容类型之间不能直接转换,比如在C++中,int *(int指针)类型和unsigned long类型就不允许直接转换,必须使用reinterpret_cast来进行类型转换,而C语言则可以使用(unsigned long)这种形式进行转换。此外,C++和const对象和非const对象也不能随意转换,从非const对象可以加上const属性转换到const对象,反之则不可以,上述代码中的"thread 1 first handler"的类型是const char *,而pthread_cleanup_push函数函数原型为:
void pthread_cleanup_push(void (*routine)(void *), void *arg);
其第二个参数类型为void *,无法从实参const char *类型转换到形参char *类型,因此该就没有匹配的构造函数来调用。
解决方法是将第二个参数使用字符数组来存储,然后将数组传递给形参,数组名会自动转换到指针,如下:
char p1[] = "thread 2 first handler"; pthread_cleanup_push(cleanup, p1);
至于为什么这个C语言版本的UNIX库函数调用会涉及到C++的类及构造函数,是因为该头文件检测到使用C++编译器时,就额外封装pthread_cleanup_class类,具体细节可自行查看/usr/include/pthread.h头文件。
pthread_cleanup_push/pop函数和C++的异常处理机制之间有着未知的相互影响或者潜在的冲突,因此不要在C++中调用pthread_cleanup_push/pop函数。例如书本图11-5中的代码,使用C编译器和C++编译器编译出来的二进制程序执行结果就不相同,如下图:
在C中,线程1没有执行清理函数,而C++中则执行了清理函数。pthread_cancel( )、pthread_cleanup_push/pop函数和C++的异常处理机制共用可能引发内存泄漏,资源丢失,程序崩溃,死锁等现象。
相关文章推荐
- UNIX环境高级编程第11章线程
- UNIX环境高级编程(第11章 线程)
- UNIX环境高级编程-第11章- 线程 - 二
- UNIX环境高级编程-第11章- 线程 - 一
- UNIX环境高级编程——线程属性之并发度
- 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
- UNIX环境高级编程——线程属性之分离属性
- UNIX环境高级编程学习之第十一章线程-用互斥锁传送安全线程参数
- UNIX环境高级编程——线程与进程区别
- UNIX环境高级编程——线程属性之分离属性
- UNIX环境高级编程——线程属性
- UNIX环境高级编程--第十一章线程总结
- 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
- UNIX环境高级编程学习之第十二章线程控制-以分离状态创建线程
- UNIX环境高级编程——线程属性之分离属性
- UNIX环境高级编程——线程属性之并发度
- UNIX环境高级编程——线程私有数据
- UNIX环境高级编程——主线程与子线程的退出关系
- UNIX环境高级编程——线程
- UNIX环境高级编程——线程属性