1. Android编译含多线程的代码
1.1 编译错误
error: implicit declaration of function 'pthread_cancel' [-Werror=implicit-function-declaration]
1.2 错误原因
Android NDK在v5版本后不再提供全部的POSIX线程库的API(比如pthread_cancel和pthread_setcancelstate)。原因之一是线程被标记结束后不一定会把自己拥有的资源释放掉,甚至不一定会结束,因此很可能造成内存泄露或死锁等问题,而这些问题在移动设备上更加突出[1]。
比较安全的方法是使用更安全pthread_kill函数代替,有关pthread_kill的功能讲解和替换方式可以参考:
/darkengine/article/details/7106207
1.3 解决办法
#define SIG_CANCEL_SIGNAL SIGUSR1#define PTHREAD_CANCEL_ENABLE 1#define PTHREAD_CANCEL_DISABLE 0typedef long pthread_t;static int pthread_setcancelstate(int state, int *oldstate) {sigset_t new, old;int ret;sigemptyset (&new);sigaddset (&new, SIG_CANCEL_SIGNAL);ret = pthread_sigmask(state == PTHREAD_CANCEL_ENABLE ? SIG_BLOCK : SIG_UNBLOCK, &new , &old);if(oldstate != NULL){*oldstate =sigismember(&old,SIG_CANCEL_SIGNAL) == 0 ? PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE;}return ret;}static inline int pthread_cancel(pthread_t thread) {return pthread_kill(thread, SIG_CANCEL_SIGNAL);}
参考网址:/p/ee417102d7fc