1、概论
POSIX线程是一个线程的标准,应用于许多主流系统,包括linux,而android是基于linux的;所以ndk使用POSIX线程
2、线程的使用
2.1 引用头文件
c中 #include <pthread.h>
C++代码中引用
extern "C" {
#include <pthread.h>
}
以pthread开头的方法类型
2.2 创建线程
int pthread_create(pthread_t *thread,constpthread_attr_t *attr, void*(*start_routine) (void*),void* arg);
thread :用来返回新创建的线程的 ID,这个 ID 就像身份证一样,指定了这个线程,可以用来在随后的线程交互中使用。
attr : 这个参数是一个 pthread_attr_t 结构体的指针,用来在线程创建的时候指定新线程的属性。如果在创建线程时,这个参数指定为 NULL, 那么就会使用默认属性。
start_routine :这个就是新线程的入口函数,当新线程创建完成后,就从这里开始执行。
arg :arg 参数就是要传递给 start_routine 的参数。
2.3 取消线程
int pthread_cancel(pthread_t thread)
thread 参数就是目的线程的线程ID
2.4 线程退出
void pthread_exit(void *retval); //结束调用者线程
当前线程是可以被 join 的,则会通过参数 retval 返回一个值
2.5 线程返回结果
int pthread_join(pthread_t thread, void** return_value_ptr);
thread:线程标识
return_value_ptr:返回结果
3、线程同步
3.1 互斥锁
以pthread_mutex 开头的方法,类型
创建
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr);
mutex:互斥锁
attr:互斥锁属性
销毁
int pthread_mutex_destroy(pthread_mutex_t* mutex);
锁定
int pthread_mutex_lock(pthread_mutex_t* mutex);
int pthread_mutex_trylock(pthread_mutex_t* mutex);
解锁
int pthread_mutex_unlock(pthread_mutex_t* mutex);
3.2 互斥锁条件
以pthread_cond 开头或者结尾
int pthread_cond_broadcast(pthread_cond_t* cond);// 通知锁可被获取,唤醒所有等待锁对象
int pthread_cond_destroy(pthread_cond_t* cond);// 销毁
int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr);// 初始化
int pthread_cond_signal(pthread_cond_t* cond);// 通知锁可被获取,唤醒某一个等待锁对象
int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* timeout);// 带超时的等待唤醒
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);// 等待唤醒
3.3 信号量
引用
C中 #include <semaphore.h>
C++ 中
extern "C" {
#include <semaphore.h>
}
使用
int sem_destroy(sem_t* sem);// 销毁
int sem_getvalue(sem_t* sem, int* value); // 获取信号量的值(value)
int sem_init(sem_t* sem, int shared, unsigned int value);初始化信号量; shared—0表示线程间共享,非零表示进程间共享
int sem_post(sem_t* sem); 解锁信号量,并且信号量增加
int sem_wait(sem_t* sem);如果信号量大于0 ,则上锁成功,并且信号量减少
在编译时,如果用cmake,则需要添加下面一句话,增加编译参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread" )
信号量没有研究,互斥锁和其条件,已经够用了,概念和java类似
网友评论