linux里头多线程编程是经常用到的。
pthread 和 sempahore都有。
最近写代码,发现要注意了以下问题。
1.坚决贯彻执行检查返回值的原则。尤其是阻塞型的函数。比如pthread_cond_wait(),sem_wait()等,因为阻塞型的很容易被中断,所以需要人为的检查。否则会出现很多莫名奇妙并且难以检查的错误。
2.变量要初始化,包括pthread_mutex_t, pthread_cond_t等。以前发现在32平台上,初始化和不初始化好像没有什么区别,程序都能够正常运行。但是在64位的机器上可能就不行了。比如pthread_mutex_t就是这样的例子。64位系统上不初始化就会一直阻塞,无法获取互斥锁
3.遵循api,不要照习惯办事。比如pthread_exit()函数。在32位系统上,如果再main函数里面调用,它会等待所有子线程结束,然后再退出main函数。所以,经常在main函数里面调用pthread_eixt,等待所有子线程退出。但是在64位系统上,情况就有点不同了啊。同上,仍是再main里面调用pthread_exit,但是main会直接退出的,虽然此时它的子线程还再运行。这个时候,main函数栈上上面的变量就要被释放了,如果此时子线程还在使用该变量的话,那就出问题了。所以等待所有子线程退出是不能用pthread_exit这个方法的,而且api本身也没有说它有个这个功能的,需要自己处理的了,不说了。
总结:
严格遵守api,才能发现错误于未然。
阅读(1747) | 评论(0) | 转发(0) |