进程:每一个进程相互独立,即使一个进程结束也没有太大影响。但在任务切换时需要频繁刷新cache缓存。故后面引出轻量级进程---线程
线程也是最小的任务调度单位
一个进程创建的多个线程可以共享一个进程的地址空间及相关资源
线程共享数据:
-
用户名、用户组名
-
静态数据和全局变量
-
文件描述符
非共享数据:
-
线程id
-
状态、优先级
-
PC
-
堆栈
线程相关接口函数
pthread_creat() --创建线程
pthread_exit() --退出线程
pthread_join() --等待线程结束
(1)线程创建
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数:
thread:线程对象(线程的编号)
attr:线程属性,填NULL表示使用默认属性
start_routine:调用函数首地址
arg:函数形参参数,如果没有参数就填NULL
返回值:成功返回0,创建失败返回错误码(小于0)
注意:
如果主线程先结束,整个程序都会结束。
示例代码:
#include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <unistd.h> int a = 5; typedef struct { int a; int b; }m_arg; void *funct(void *head) //创建的线程 { m_arg *b = (m_arg *)head; printf("%d\n",b->b); while((b->a)--) { printf("aaaaaaaa%d\n",b->a); sleep(1); } } int main(int argc, char *argv[]) { m_arg arr = {5,6}; pthread_t thread; printf("%d\n",a); int ret = pthread_create(&thread,NULL,funct,&arr);//创建线程 if(ret != 0) //判断创建是否成功 { perror("pthread_create"); exit(0); } while(1) //主线程 { printf("bbbbbbbb\n"); sleep(1); } return 0; }
(2)退出线程
#include <pthread.h> void pthread_exit(void *retval)
参数:
retval:线程结束返回的信息,可以是任意信息,一般是字符串,没有可以填NULL
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a = 5;
typedef struct
{
int a;
int b;
}m_arg;
void *funct(void *head) //创建的线程
{
m_arg *b = (m_arg *)head;
printf("%d\n",b->b);
while((b->a)--)
{
if(b->a == 3)
pthread_exit(NULL); //等待秒关闭线程
printf("aaaaaaaa%d\n",b->a);
sleep(1);
}
}
int main(int argc, char *argv[])
{
m_arg arr = {5,6};
pthread_t thread;
printf("%d\n",a);
int ret = pthread_create(&thread,NULL,funct,&arr);//创建线程
if(ret != 0) //判断创建是否成功
{
perror("pthread_create");
exit(0);
}
while(1) //主线程
{
printf("bbbbbbbb\n");
sleep(1);
}
return 0;
}
(3)等待线程退出
#include <pthread.h> int pthread_join(pthread_t thread,void **retval) ;
参数:
thread:线程对象(线程编号)
retval:接受返回的字符串信息
返回值:
成功返回0,创建失败返回错误码。
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
typedef struct
{
int a;
int b;
}m_arg;
void *funct(void *head) //线程2函数
{
m_arg *b = (m_arg *)head;
printf("%d\n",b->b);
while((b->a)--)
{
if(b->a == 3)
pthread_exit("thread_funtc1");
printf("aaaaaaaa%d\n",b->a);
sleep(1);
}
}
void *funtc2() //线程1函数
{
int n = 5;
while(n--)
{
if(n == 2)
pthread_exit("thread_funtc2");
printf("cccccccc\n");
sleep(1);
}
}
int main(int argc, char *argv[])
{
m_arg arr = {5,6};
pthread_t thread;
pthread_t thread2;
int ret = pthread_create(&thread,NULL,funct,&arr); //创建线程1
if(ret != 0)
{
perror("pthread_create");
exit(0);
}
int ret1 = pthread_create(&thread2,NULL,funtc2,NULL); //创建线程2
if(ret1 != 0)
{
perror("pthread_create2");
exit(0);
}
void *result = NULL;
pthread_join(thread,&result); //等待线程1退出
printf("%s\n",(char *)result);
pthread_join(thread,&result); //等待线程2退出
printf("%s\n",(char *)result);
printf("bbbbbbbb\n");
sleep(1);
return 0;
}