一、线程的概念
1.线程就是“轻量级”的进程。
2.
线程不创建新的代码段以及数据段,与创建它的进程共享数据段以及代码段。
3.线程拥有自己独立的栈
二、线程的函数学习
1.创建新线程
int pthread_create(pthread_t *thread,const pthread_attr_t* attr,void*(*start_toutine)(void*),void *arg)
gcc -lpthread 在编译时需要使用该库
<pthread.h> 在编译时,必须链接pthread库
函数的功能:
创建一个新的线程
返回值:
成功:返回 0
失败:返回错误编码
参数:
thread :新创建的线程的ID
attr:待创建线程是属性,一般为NULL
start_routine:线程要执行的入口函数
arg:线程入口函数的参数可以为空
2.等待线程结束
int pthread_jion(pthread_t thread,void** reval);
函数功能:
用于等待线程的结束
返回值:
成功:返回0
失败:返回错误的编号
参数:
pthread:要等待的线程结束的ID
reval:保存线程退出时的状态,一般为NULL
3.退出线程
void pthread_exit(void *retval)
函数功能:结束线程,不能使用exit(),因为exit()将调用线程的进程也退出了,所以不能使用exit()
返回值:空
参数:保存返回值
三、线程的互斥
线程互斥:在实际应用中,多个线程往往会访问同一数据或资源,为了避免线程之间的相互影响,需要引入线程互斥机制,而互斥锁是互斥中的一种。
1.初始化互斥锁
pthread_mutex_init();
2.获取互斥锁
pthread_mutex_lock();
3.释放互斥锁
pthread_mutex_unlock();
四
、线程的互斥实例
#include <pthread.h>
#include<stdio.h>
#include<unistd.h>
pthread_t thread[2];
int number=0;
/*定义一个互斥锁*/
pthread_mutex_t mux;
void* work1()
{
int i=0;
printf("i am worker1\n");
for(i=0;i<10;i++)
{
pthread_mutex_lock(&mux);
number++;
pthread_mutex_unlock(&mux);
printf("woker1 number is %d\n",number);
sleep(1);
}
pthread_exit(NULL);
}
void* work2()
{
int i=0;
printf("i am worker2\n");
for(i=0;i<10;i++)
{
pthread_mutex_lock(&mux);
number++;
pthread_mutex_unlock(&mux);
printf("woker2 number is %d\n",number);
sleep(1);
}
pthread_exit(NULL);
}
void main()
{
/*在主进程中完成互斥锁的初始化*/
pthread_mutex_init(&mux,NULL);
//1.创建工人1线程
pthread_create(&thread[0],NULL,work1,NULL);
//2.创建工人2线程
pthread_create(&thread[1],NULL,work2,NULL);
//3.等待工人1线程结束
pthread_join(thread[0],NULL);
//4.等待工人2线程结束
pthread_join(thread[1],NULL);
}