线程基础及线程库的使用

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值