sem_init:
int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
功能:初始化信号量
返回值:创建成功返回0,失败返回-1
参数sem:指向信号量结构的一个指针
参数pshared:不为0时此信号量在进程间共享,为0时当前进程的所有线程共享
参数value:信号量的初始值
sem_wait():
用来阻塞当前线程,直到信号量的值大于0,解除阻塞。解除阻塞后,sem的值-1,表示公共资源被执行减少了。
例如:如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,执行后,信号量的值将-1。
当初始化value=0后,使用sem_wait会阻塞这个线程,这个线程函数就会等待其它线程函数调用sem_post增加了了这个值使它不再是0, 才开始执行,然后value值-1。
sem_post:
用于增加信号量的值+1
sem_destroy(&sem):
释放信号量
int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,void* (start_rtn)(void),void *restrict arg);
功能:UNIX环境创建线程
参数:
(1)tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
(2)attr:用于定制各种不同的线程属性。APUE的12.3节讨论了线程属性。通常直接设为NULL。
(3)start_rtn:新创建线程从此函数开始运行。无参数是arg设为NULL即可。
(4)arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。
返回值:
成功返回0,否则返回错误码。
int pthread_join(pthread_t thread, void **retval);
功能:主线程等待子线程的终止。也就是在主线程调用了pthread_join()方法后面的代码,只有等到子线程结束了才能执行。
参数:
pthread_t thread: 被连接线程的线程号
void **retval : 指向一个指向被连接线程的返回码的指针的指针
return:
线程连接的状态,0是成功,非0是失败
void pthread_exit(void *retval);
功能:线程退出
函数参数:retval表示线程退出状态,通常传NULL
编译时注意:
需加gcc work1.c -o work1 -lpthread
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<semaphore.h>
sem_t sem;
void *runner(void * arg){
sem_wait(&sem); //阻塞当前线程 直到pos释放信号量,使信号量大于0 继续运行下面的
printf("this is son pthread\n");
for(int i=5;i>=1;i--)
{
printf("第N号奶茶开始制作,预计等待时间%d秒\n",i);
sleep(1);
}
pthread_exit(0);
}
int main(){
int res=-1;
res = sem_init(&sem,0,0);
//初始化信号量 sem为指向信号量结构的一个指针,0:在所有线程间共享。0:信号量初值为0
//如果创建成功 返回0 失败返回-1
if(res == -1){ //创建失败
printf("semaphore iniitialzation failed\n");
exit(EXIT_FAILURE);
}
pthread_t tid;
//创建线程runner
res = pthread_create(&tid,NULL,runner,NULL);
//tid:事先创建好的pyhread_t类型的参数线程号。 NULL:通常设置的属性。runner:新建的线程函数。NULL参数。
//返回值:0为创建成功
if(res!=0){
printf("pthread_create failed\n");
exit(EXIT_FAILURE);
}
printf("this is father pthread \n");
sem_post(&sem); //释放信号两 子线程开始执行
res = pthread_join(tid,NULL); //主线程等待子线程终止 tid:线程号 NULL:
printf("back to father thread\n");
printf("第N号奶茶可以取货!\n");
sem_destroy(&sem); //释放信号量 sem+1信号量加一
return 0;
}