·1.线程创建
函数原型:int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
返回值:若是成功建立线程返回0,否则返回错误的编号。
形式参数:pthread_t *restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void* (start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。
·线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然 后程序才会断续执行。
函数原型:int pthread_join( pthread_t thread, void **value_ptr);
参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。
·线程退出
函数原型:void pthread_exit(void *rval_ptr);
·获取当前线程id
函数原型:pthread_t pthread_self(void);
2. a)创建信号量 sem_init
b)等待信号量 sem_wait
c)释放信号量 sem_pos
d)删除信号量 sem_destro
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#define BUF_SZ 1024
sem_t sem1,sem2;
char buf[BUF_SZ];
void *write(void *buf) //生产者写入
{
while(1)
{
sem_wait(&sem1); //信号量sem1 p操作
printf("writing...\n");
if(fgets(buf, BUF_SZ, stdin) == NULL) //从键盘获取字符写到数组buf
{
printf("write error!\n");
exit(1);
}
if(strncmp(buf,"end",3) == 0) //输入end退出线程1
{
sem_post(&sem2); //信号量sem2 v操作
break;
}
sem_post(&sem2); //信号量sem2 v操作
}
}
void *read(void *buf) //消费者读取
{
while(1)
{
sem_wait(&sem2); //信号量sem2 p操作
printf("read %s",buf);
if(strncmp((buf,"end",3) == 0) //读取到end,退出线程2
{
sem_post(&sem1); //信号量sem1 v操作
break;
}
sem_post(&sem1); //信号量sem1 v操作
}
}
int main()
{
pthread_t t1,t2;
int ret1,ret2;
if(sem_init(&sem1,0,1) == -1) //初始化信号量sem1
{
printf("init sem1 error!\n");
exit(1);
}
if(sem_init(&sem2,0,0) == -1) //初始化信号量sem2
{
printf("init sem2 error!\n");
exit(1);
}
if(memset(text,0,sizeof(text)) == NULL)
{
printf("memset error!\n");
exit(1);
}
ret1 = pthread_create(&t1,NULL,(void *)write,(void *)text);//创建线程1
if(ret1 < 0)
{
printf("thread1 create error!\n");
exit(1);
}
ret2 = pthread_create(&t2,NULL,(void *)read,(void *)text);//创建线程2
if(ret2 < 0)
{
printf("thread2 create error!\n");
exit(1);
}
pthread_join(t1,NULL); //等待线程1退出
pthread_join(t2,NULL);
if(sem_destroy(&sem1) == -1) //删除信号量sem1
{
printf("delete sem1 error!\n");
exit(1);
}
if(sem_destroy(&sem2) == -1) //删除信号量sem2
{
printf("delete sem2 error!\n");
exit(1);
}
return 0;
} </span>