NDK自带支持POSIX标准
安装posix文档
apt-get install manpages-posix-dev
gcc -c pthread_test.c -o pthread_test -lpthread (得到的是.o文件,而不是可执行文件)
gcc pthread_test.c -o pthread_test -lpthread(得到的是可执行文件)
一、线程相关函数
pthread_create()
:创建一个新的线程,并将线程加入当前进程
pthread_exit()
:终止当前线程
pthread_cancel()
:中断另外一个线程的运行
pthread_join()
:阻塞当前的线程,直到另外一个线程运行结束
pthread_kill()
:向指定线程发送信号,信号为0时用于检查此线程ID的线程是否存活。
二、线程同步相关:互斥锁(量)与条件变量
pthread_mutex_init()
:初始化互斥锁
pthread_mutex_destroy()
:删除互斥锁
pthread_mutex_lock()
:占有互斥锁(阻塞操作)
pthread_mutex_trylock()
:试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock()
: 释放互斥锁
pthread_cond_init()
:初始化条件变量
pthread_cond_destroy()
:销毁条件变量
pthread_cond_signal()
:唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait()
:等待条件变量的特殊条件发生
三、生产者,消费者具体示例
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#define CONSUMER_NUM 1
#define PRODUCER_NUM 2
pthread_t pids[CONSUMER_NUM+PRODUCER_NUM];
//产品队列
int product = 0;
//互斥锁
pthread_mutex_t mutex;
//条件变量
pthread_cond_t has_product;
//生产
void* producer(void* arg){
printf("producer \n");
int no = (int)arg;
//条件变量
while(1){
pthread_mutex_lock(&mutex);
//往队列添加产品
product++;
printf("producer %d, produce product", no);
//通知消费者,有新产品可以消费了
pthread_cond_signal(&has_product);
printf("producer %d, signal",no);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
//消费
void* consumer(void* arg){
for(;;){
pthread_mutex_lock(&mutex);
while(product==0){
//没有产品,继续等待
//1.阻塞等待has_product被唤醒
//2.释放互斥锁,pthread_mutext_unlock
//3.被唤醒时,解除阻塞,重新申请获取互斥锁pthread_mutex_lock
pthread_cond_wait(&has_product, &mutex);
}
//有产品,消费产品
ready--;
printf("comsume product\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void main(){
pthread_t tid_p, tid_c;
//初始化互斥锁和条件变量
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&has_product,NULL);
printf("init");
//生产者线程
pthread_create(&tid_p,NULL,producer,(void*)1);
//消费者线程
pthread_create(&tid_c,NULL,consumer,NULL);
printf("created");
//等待
pthread_join(tid_p,NULL);
pthread_join(tid_c,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&has_product);
}
int
pthread_create
(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void ( start_routine)(void *), void *restrict arg);
参数说明:
- tidp:新创建的线程ID会被设置成tidp指向的内存单元。
- attr:用于定制各种不同的线程属性,默认为NULL
- start_routine:新创建的线程从start_rtn函数的地址开始运行,该函数只有一个void类型的指针参数即arg,如果start_routine需要多个参数,可以将参数放入一个结构体中,然后将结构的地址作为arg传入。
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)