天天看点

线程基础及线程库的使用

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

}