1、线程:是轻量级的进程。
是进程内部的一条执行序列(一组有序指令),或者说是执行流。一个进程至少有一条线程,即就是main函数所代表的执行序列。称之为主线程。通过线程库可以创建线程—函数线程。
主线程仅仅代表进程执行的的第一条线程而已。当主线程通过线程库创建出函数线程以后,两个(所有)线程就没有任何区别。
2、线程与进程的区别。
(1)进程是资源分配的单位
线程是CPU调度执行的单位(指令)
(2)多进程,进程间资源都是独立的,同一进程中的多线程,资源是共享。
3、线程库的使用:
创建:
int pthread_create(pthread_t id,pthread_attr_t attr,
线程id 线程属性
Void (pthread_fun)(void),void arg)
线程函数指针 传进来的一个参数
退出
Void pthread_exit(void retval)结束一个线程
int pthread_join(pthread_t,void* retval)等待线程结束
取消线程
int pthread_cancel(pthread_id);
线程的实现方式:
1、用户级线程
2、内核级线程
3、混合级线程
创建线程–》 只会在进程资源中申请栈区资源,用于线程函数的执行。进程中的数据区域、堆区多线程都是使用同一份,其都是共享的。
1、多线程的数据共享
1、全局:共享 虚拟地址相等 同一进程中的多个线程共享进程的4G虚拟地址空间 页表–》对进程而言
2、栈区:不共享 —》创建线程时,将栈区数据的地址传递函数线程,然后就共享了。
3、堆区:共享
4、文件描述符:共享
int fd(称之为文件描述符) = open();
测试代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<pthread.h>
int gdata = 10;
int fd = -1;
int *p = NULL;
void* fun(void *arg)
{
printf(“gdata = %d, addr = 0x%x\n”, gdata, &gdata);
gdata = 20;
printf(“gdata = %d, addr = 0x%x\n”, gdata, &gdata);
printf("*p = %d, addr = 0x%x\n", *p, p);
}
int main()
{
fd = open();
assert(fd != -1);
p = (int *)malloc(4);
*p = 10;
pthread_t id;
int res = pthread_create(&id,NULL,fun,NULL);
assert(res == 0);
sleep(2);
printf("main::gdata = %d, addr = 0x%x\n", gdata, &gdata);
printf("*p = %d, addr = 0x%x\n", *p, p);
}