美文网首页
Android ndk中posix线程使用

Android ndk中posix线程使用

作者: 众少成多积小致巨 | 来源:发表于2019-07-05 17:05 被阅读0次

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类似

相关文章

网友评论

      本文标题:Android ndk中posix线程使用

      本文链接:https://www.haomeiwen.com/subject/chpehctx.html